чување f9597f258c447021a444ccffe70082ebc9a12a66
родитељ 7a652755a9d5c953d5fa9fc8a31a19459a1d1509
Аутор: Страхиња Радић <contact@strahinja.org>
Датум: Sun, 27 Feb 2022 17:08:34 +0100
Avoid memory leak when rereading the file
Signed-off-by: Страхиња Радић <contact@strahinja.org>
Diffstat:
измењених датотека: 3, додавања: 10(+), брисања: 13(-)
diff --git a/draw.c b/draw.c
@@ -138,15 +138,18 @@ init_drawstate(struct DrawState* state, char* error, char* action,
}
void
-free_drawstate(struct DrawState* state)
+free_drawstate(struct DrawState* state, int skip_paste_free)
{
size_t row = 0;
for (row = 0; row < state->buffer_size; row++)
free_bufferline(state->buffer + row);
free(state->buffer);
- for (row = 0; row < state->paste_size; row++)
- free_bufferline(state->paste + row);
- free(state->paste);
+ if (!skip_paste_free)
+ {
+ for (row = 0; row < state->paste_size; row++)
+ free_bufferline(state->paste + row);
+ free(state->paste);
+ }
free(state->input);
}
diff --git a/draw.h b/draw.h
@@ -90,7 +90,7 @@ void init_bufferline(struct BufferLine* bl);
void free_bufferline(struct BufferLine* bl);
void init_drawstate(struct DrawState* state, char* error, char* action,
char* filename, char* prompt, int skip_paste_and_mode_init);
-void free_drawstate(struct DrawState* state);
+void free_drawstate(struct DrawState* state, int skip_paste_free);
size_t display_length(const struct DrawState* state, uint32_t* buffer,
const size_t max_index);
size_t buffer_length(const struct DrawState* state, uint32_t* buffer,
diff --git a/sled.c b/sled.c
@@ -594,15 +594,9 @@ reread_file(struct DrawState* state)
{
long lineno = 1;
long col = 1;
- size_t row = 0;
int result;
- for (row = 0; row < state->buffer_size; row++)
- free_bufferline(state->buffer + row);
- free(state->buffer);
- /*for (row = 0; row < state->paste_size; row++)
- free_bufferline(state->paste + row);
- free(state->paste);*/
+ free_drawstate(state, 1);
init_drawstate(state, state->error, state->action, state->filename,
state->prompt, 1);
@@ -1783,6 +1777,6 @@ init_termbox:
if (state.error && *state.error)
return print_error(1, state.error);
- free_drawstate(&state);
+ free_drawstate(&state, 0);
return 0;
}