чување c012a668f5bbaa53c25a5ed9367067d7831d9d85
родитељ 6af51bef1e77845f5b594a2745e9507a6f903964
Аутор: Страхиња Радић <sr@strahinja.org>
Датум: Sat, 2 Nov 2024 09:35:09 +0100
Bugfix: SEGV with format_codep on C-O; don't free memory on exit
Diffstat:
измењених датотека: 4, додавања: 9(+), брисања: 21(-)
diff --git a/TODO.done b/TODO.done
@@ -1,6 +1,8 @@
Done or canceled todos
======================
+[x] Bugfix: SEGV in format_codep when rereading the file
+
[x] Reconsider state.error; it might be better to store only the errno code a la
errno
- Should tb_shutdown be called if malloc failed? It deallocates memory,
diff --git a/draw.c b/draw.c
@@ -556,7 +556,8 @@ format_codep(char* result, ssize_t result_size, const char* format,
char codep[LINE_DEFAULT];
assert((state != NULL) && (format != NULL));
UNUSED(seg_size);
- if (state->buffer[state->coord.row].text[state->coord.col])
+ if (state->buffer
+ && state->buffer[state->coord.row].text[state->coord.col])
snprintf(codep, LINE_DEFAULT, "%06X",
state->buffer[state->coord.row].text[state->coord.col]);
else
@@ -652,27 +653,13 @@ free_bufferline(struct BufferLine* bl)
}
void
-free_drawstate(struct DrawState* state, const int skip_paste_free,
- const int skip_filename_free)
+free_drawstate(struct DrawState* state)
{
ssize_t row = 0;
assert(state != NULL);
for (row = 0; row < state->buffer_size; row++)
free_bufferline(state->buffer + row);
free(state->buffer);
- if (!skip_filename_free)
- {
- free(state->backup_filename);
- free(state->real_filename);
- free(state->filename);
- free(state->orig_real_filename);
- }
- if (!skip_paste_free)
- {
- for (row = 0; row < state->paste_size; row++)
- free_bufferline(state->paste + row);
- free(state->paste);
- }
free(state->input);
free(state->search);
}
diff --git a/draw.h b/draw.h
@@ -164,8 +164,7 @@ void format_mode(char* result, ssize_t result_size, const char* format,
void format_position(char* result, ssize_t result_size, const char* format,
const ssize_t seg_size, const struct DrawState* state);
void free_bufferline(struct BufferLine* bl);
-void free_drawstate(struct DrawState* state, const int skip_paste_free,
- const int skip_filename_free);
+void free_drawstate(struct DrawState* state);
void init_bufferline(struct BufferLine* bl);
void init_coord(struct Coord* c, const int col, const int row);
void init_drawstate(struct DrawState* state, char* filename, char* prompt,
diff --git a/sled.c b/sled.c
@@ -1958,7 +1958,7 @@ static int
reread_file(struct DrawState* state)
{
assert(state != NULL);
- free_drawstate(state, 1, 1);
+ free_drawstate(state);
init_drawstate(state, state->filename, state->prompt, 1, 1);
redraw_status(state);
@@ -3168,9 +3168,9 @@ main_done:
print_error(1, errors[state.error], state.filename);
else if (state.error)
print_error(1, errors[state.error]);
- free_drawstate(&state, 0, 0);
+ /*free_drawstate(&state);
free(wd);
free(dir);
- free(rfn);
+ free(rfn);*/
return state.error ? CUSTOM_ERROR_START + state.error : saved_errno;
}