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