sled

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

чување 581ee42fae991c6a6b44129dc46df434c3bdf77d
родитељ ada7f359f52eee44efcc562ff34d1278f972e483
Аутор: Страхиња Радић <contact@strahinja.org>
Датум:   Sun, 30 Jun 2024 16:15:49 +0200

Use free(3) to prevent leaks; use goto to avoid repeated code

Diffstat:
Mdraw.c | 1+
Msled.c | 115++++++++++++++++++++++++++++---------------------------------------------------
измењених датотека: 2, додавања: 41(+), брисања: 75(-)

diff --git a/draw.c b/draw.c @@ -592,6 +592,7 @@ free_drawstate(struct DrawState* state, int skip_paste_free) free_bufferline(state->buffer + row, 1); free(state->backup_filename); free(state->real_filename); + free(state->filename); free(state->orig_real_filename); free(state->buffer); if (!skip_paste_free) diff --git a/sled.c b/sled.c @@ -2678,7 +2678,7 @@ main(int argc, char** argv) char* wd = NULL; ssize_t filename_size = 0; struct stat st; - int result; + int result = 0; int dir_access; int dir_access_errno; char* dir = NULL; @@ -2770,9 +2770,7 @@ main(int argc, char** argv) if (unveil(state.filename, "rwc") < 0) { perror(PROGRAM_NAME ": unveil"); - free(filename); - free(dir); - exit(1); + goto main_cleanup; } #endif @@ -2780,9 +2778,7 @@ main(int argc, char** argv) if (unveil(dir, "rwc") < 0) { perror(PROGRAM_NAME ": unveil"); - free(filename); - free(dir); - exit(1); + goto main_cleanup; } #endif @@ -2792,25 +2788,18 @@ main(int argc, char** argv) if (!(wd = malloc(limits[L_PATH_MAX]))) { perror(PROGRAM_NAME ": malloc"); - free(filename); - free(dir); - exit(1); + goto main_cleanup; } if (!getcwd(wd, limits[L_PATH_MAX])) { perror(PROGRAM_NAME ": getcwd"); - free(wd); - free(filename); - free(dir); - exit(1); + goto main_cleanup; } #ifdef __OpenBSD__ if (unveil(wd, "rwc") < 0) { perror(PROGRAM_NAME ": unveil"); - free(filename); - free(dir); - exit(1); + goto main_cleanup; } #endif @@ -2821,25 +2810,20 @@ main(int argc, char** argv) { if (!(rfn = malloc(limits[L_PATH_MAX]))) { - free(filename); - free(dir); perror(PROGRAM_NAME ": malloc"); - exit(1); + goto main_cleanup; } if (!(state.real_filename = malloc(limits[L_PATH_MAX]))) { - free(filename); - free(dir); - free(rfn); perror(PROGRAM_NAME ": malloc"); - exit(1); + goto main_cleanup; } state.rfn_len = readlink(state.filename, rfn, limits[L_PATH_MAX]); if (state.rfn_len == -1) - goto file_error; + goto errno_set; rfn[state.rfn_len] = 0; @@ -2855,11 +2839,8 @@ main(int argc, char** argv) = strndup(rfn, state.rfn_len); if (!state.orig_real_filename) { - free(filename); - free(dir); - free(rfn); perror(PROGRAM_NAME ": strndup"); - exit(1); + goto main_cleanup; } MEMCCPY(state.real_filename, dir, @@ -2867,8 +2848,7 @@ main(int argc, char** argv) if (!temp) { print_error(1, "Pathname too long"); - free(filename); - exit(1); + goto main_cleanup; } *(temp - 1) = '/'; MEMCCPY_EXT(temp, state.real_filename, rfn, @@ -2877,29 +2857,27 @@ main(int argc, char** argv) state.rfn_len = temp - state.real_filename - 1; } free(rfn); + rfn = NULL; #ifdef __OpenBSD__ if (unveil(state.real_filename, "rwc") < 0) { perror(PROGRAM_NAME ": unveil"); - free(filename); - exit(1); + goto main_cleanup; } #endif if (stat(state.real_filename, &st) == -1) - goto file_error; + goto errno_set; } } /* We don't error out here on ENOENT to account for new files */ else if (errno == ENOENT) state.new_file = 1; else - goto file_error; + goto errno_set; if (!(state.backup_filename = calloc(limits[L_PATH_MAX], 1))) { - free(state.real_filename); - free(filename); - free(dir); - return print_error(1, "Allocation failed (out of memory?)"); + perror(PROGRAM_NAME ": calloc"); + goto main_cleanup; } /* Backup filename is the target file + suffix if the file to @@ -2920,9 +2898,7 @@ main(int argc, char** argv) if (unveil(state.backup_filename, "rwc") < 0) { perror(PROGRAM_NAME ": unveil"); - free(filename); - free(dir); - exit(1); + goto main_cleanup; } #endif @@ -2933,7 +2909,7 @@ main_skip_backups: { result = 1; perror(PROGRAM_NAME ": realloc"); - goto general_error; + goto main_cleanup; } dir = pdir; *dir = 0; @@ -2942,9 +2918,7 @@ main_skip_backups: if (unveil(dir, "rwc") < 0) { perror(PROGRAM_NAME ": unveil"); - free(filename); - free(dir); - exit(1); + goto main_cleanup; } #endif } @@ -2953,10 +2927,7 @@ main_skip_backups: if (unveil(NULL, NULL) < 0) { perror(PROGRAM_NAME ": unveil"); - free(filename); - free(dir); - free(rfn); - exit(1); + goto main_cleanup; } #endif @@ -2972,7 +2943,7 @@ main_skip_backups: if (errno != ENOENT || dir_access == -1) { errno = dir_access_errno; - goto file_error; + goto errno_set; } result = create_file(&state); switch (result) @@ -2980,7 +2951,7 @@ main_skip_backups: case LOAD_ERR_CANT_ALLOC: result = print_error(result, "Allocation failed (out of memory?)"); - goto general_error; + goto main_cleanup; default:; } goto init_termbox; @@ -2989,15 +2960,15 @@ main_skip_backups: if (!S_ISREG(st.st_mode)) { result = print_error(EINVAL, "Is not a regular file"); - goto general_error; + goto main_cleanup; } if (access(state.filename, F_OK | R_OK | W_OK) == -1) - goto file_error; + goto errno_set; if (state.rfn_len > 0 && access(state.real_filename, F_OK | R_OK | W_OK) == -1) - goto file_error; + goto errno_set; result = load_file(&state); switch (result) @@ -3005,28 +2976,14 @@ main_skip_backups: case LOAD_ERR_CANT_ALLOC: result = print_error(result, "Allocation failed (out of memory?)"); - goto general_error; + goto main_cleanup; case LOAD_ERR_CANT_OPEN_FILE: result = print_error(result, "Cannot open file `%s'", filename); - goto general_error; + goto main_cleanup; default:; } goto init_termbox; -file_error: - result = errno; - perror(PROGRAM_NAME); - /* FALLTHROUGH */ - -general_error: - free(state.real_filename); - free(state.backup_filename); - free(wd); - free(filename); - free(dir); - free(rfn); - return result; - init_termbox: tb_init(); *error = 0; @@ -3060,12 +3017,20 @@ init_termbox: { if (errno != 0) perror(PROGRAM_NAME); - free(filename); - return print_error(1, state.error); + print_error(1, state.error); + result = 1; } + goto main_cleanup; +errno_set: + result = errno; + perror(PROGRAM_NAME); + /* FALLTHROUGH */ + +main_cleanup: free_drawstate(&state, 0); - free(filename); + free(wd); free(dir); - return 0; + free(rfn); + return result; }