чување 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:
| M | draw.c | | | 1 | + |
| M | sled.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;
}