sled

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

чување 71939d0e1531677316a161026ae43b44e3927128
родитељ 3ea1520f4ad9b6dbb8c0f5da186069079f20694e
Аутор: Страхиња Радић <contact@strahinja.org>
Датум:   Thu, 16 May 2024 12:50:52 +0200

Fixed a few instances of leaks and dead code thanks to LLVM's scan-build

Signed-off-by: Страхиња Радић <contact@strahinja.org>

Diffstat:
Mdraw.c | 4++--
Msled.c | 77+++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------------------
измењених датотека: 2, додавања: 59(+), брисања: 22(-)

diff --git a/draw.c b/draw.c @@ -203,7 +203,7 @@ format_mode(char* result, size_t result_size, const char* format, { const char* mode_label = mode_labels[UNKNOWN_MODE]; if (!result) - return; + goto format_print; if (IN(state->mode, M_HELP)) mode_label = mode_labels[HELP_MODE]; else if (IN(state->mode, M_PROMPT)) @@ -217,6 +217,7 @@ format_mode(char* result, size_t result_size, const char* format, else mode_label = mode_labels[INSERT_MODE]; +format_print: snprintf(result, result_size, format, mode_label); } @@ -684,7 +685,6 @@ draw_screen(const struct DrawState* state) if (state->rows_count == 0) return state; - current = state->buffer; while ((i < state->rows_count) && (cy < max_screen_lines)) { current = state->buffer + i; diff --git a/sled.c b/sled.c @@ -730,7 +730,6 @@ load_file(struct DrawState* state, long* lineno, long* col) redraw_status(state); state->buffer = newchunk; - line = state->buffer; state->buffer_size = ALLOC_DELTA; state->rows_count = 0; @@ -770,7 +769,6 @@ load_file(struct DrawState* state, long* lineno, long* col) } state->buffer[row].text = newtext; } - line = state->buffer + state->buffer_size - ALLOC_DELTA; } line = state->buffer + state->rows_count; line->length @@ -955,6 +953,7 @@ save_file(struct DrawState* state) #ifdef CREATE_BACKUPS struct stat st; #endif + int result = SAVE_ERR_NONE; if (!(buf = calloc(MAXBUFLINE, 1))) return SAVE_ERR_CANT_ALLOC; @@ -976,34 +975,52 @@ save_file(struct DrawState* state) } #else /* !BACKUP_FAIL_OK */ if (unlink(state->backup_filename) < 0 && errno != ENOENT) - return SAVE_ERR_CANT_COPY_FILE; + { + result = SAVE_ERR_CANT_COPY_FILE; + goto save_file_cleanup; + } if (cp(state->rfn_len > 0 ? state->real_filename : state->filename, state->backup_filename) == -1) - return SAVE_ERR_CANT_COPY_FILE; + { + result = SAVE_ERR_CANT_COPY_FILE; + goto save_file_cleanup; + } #endif /* BACKUP_FAIL_OK */ #endif /* CREATE_BACKUPS */ if (!(output = fopen(state->rfn_len > 0 ? state->real_filename : state->filename, "w"))) - return SAVE_ERR_CANT_OPEN_FILE; + { + result = SAVE_ERR_CANT_OPEN_FILE; + goto save_file_cleanup; + } #ifdef CREATE_BACKUPS if (lstat(state->rfn_len > 0 ? state->real_filename : state->filename, &st) < 0) - return SAVE_ERR_CANT_STAT_FILE; + { + result = SAVE_ERR_CANT_STAT_FILE; + goto save_file_cleanup; + } #ifdef BACKUP_FAIL_OK if (state->backup_possible) { if (state->rfn_len > 0) { if (unlink(state->filename) == -1) - return SAVE_ERR_CANT_UNLINK; + { + result = SAVE_ERR_CANT_UNLINK; + goto save_file_cleanup; + } if (symlink(state->real_filename, state->filename) == -1) - return SAVE_ERR_CANT_SYMLINK; + { + result = SAVE_ERR_CANT_SYMLINK; + goto save_file_cleanup; + } } if (!state->new_file) chmod(state->rfn_len > 0 ? state->real_filename @@ -1014,9 +1031,15 @@ save_file(struct DrawState* state) if (state->rfn_len > 0) { if (unlink(state->filename) == -1) - return SAVE_ERR_CANT_UNLINK; + { + result = SAVE_ERR_CANT_UNLINK; + goto save_file_cleanup; + } if (symlink(state->real_filename, state->filename) == -1) - return SAVE_ERR_CANT_SYMLINK; + { + result = SAVE_ERR_CANT_SYMLINK; + goto save_file_cleanup; + } } if (!state->new_file) chmod(state->rfn_len > 0 ? state->real_filename @@ -1038,7 +1061,7 @@ save_file_cleanup: fclose(output); free(buf); *state->action = 0; - return SAVE_ERR_NONE; + return result; } void @@ -2066,7 +2089,6 @@ simple_insert_line(struct DrawState* state) } line->text = newtext; } - line = state->buffer + state->rows_count; } state->rows_count++; for (size_t i = state->rows_count - 1; i > state->coord.row + 1; i--) @@ -2379,7 +2401,7 @@ main(int argc, char** argv) state.rfn_len = readlink(state.filename, state.real_filename, MAXPATH); if (state.rfn_len == -1) - return print_error(1, strerror(errno)); + goto file_error; state.real_filename[state.rfn_len] = 0; #ifdef __OpenBSD__ if (unveil(state.real_filename, "rwc") < 0) @@ -2389,11 +2411,14 @@ main(int argc, char** argv) } #endif if (stat(state.real_filename, &st) == -1) - return print_error(1, strerror(errno)); + goto file_error; } if (!(state.backup_filename = calloc(MAXPATH, 1))) + { + free(state.real_filename); return print_error(1, "Allocation failed (out of memory?)"); + } /* Backup filename is the target file + suffix if the * file to write is a symlink, otherwise file + suffix */ @@ -2411,7 +2436,7 @@ main(int argc, char** argv) else if (errno == ENOENT) state.new_file = 1; else - return print_error(1, strerror(errno)); + goto file_error; #endif /* CREATE_BACKUPS */ if (state.rfn_len > 0) @@ -2448,15 +2473,19 @@ main(int argc, char** argv) switch (result) { case LOAD_ERR_CANT_ALLOC: - return print_error(result, + result = print_error(result, "Allocation failed (out of memory?)"); + goto general_error; default:; } goto init_termbox; } if (!S_ISREG(st.st_mode)) - return print_error(EINVAL, "Is not a regular file"); + { + result = print_error(EINVAL, "Is not a regular file"); + goto general_error; + } #ifdef __OpenBSD__ if (unveil(NULL, NULL) < 0) @@ -2477,16 +2506,24 @@ main(int argc, char** argv) switch (result) { case LOAD_ERR_CANT_ALLOC: - return print_error(result, "Allocation failed (out of memory?)"); + result = print_error(result, "Allocation failed (out of memory?)"); + goto general_error; case LOAD_ERR_CANT_OPEN_FILE: - return print_error(result, "Cannot open file `%s'", filename); + result = print_error(result, "Cannot open file `%s'", filename); + goto general_error; default:; } goto init_termbox; file_error: + result = errno; perror(program_name); - return errno; + /* FALLTHROUGH */ + +general_error: + free(state.real_filename); + free(state.backup_filename); + return result; init_termbox: tb_init();