sled

Једноставни уређивач текста
git clone https://git.sr.ht/~strahinja/sled
Дневник | Датотеке | Референце | ПРОЧИТАЈМЕ | ЛИЦЕНЦА

чување 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:
MTODO.done | 2++
Mdraw.c | 19+++----------------
Mdraw.h | 3+--
Msled.c | 6+++---
измењених датотека: 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; }