чување 092e351ed67fa613cb1298bf3233ad89a7f14ab8
родитељ 7e1912b2d16aa548710c1c6e82cea0092110dd4c
Аутор: Страхиња Радић <contact@strahinja.org>
Датум: Mon, 1 Jul 2024 18:36:28 +0200
Bugfix: Fix SEGV when erasing lines (leftover logic from fixed
buffers); add setting error message and running = 0 on allocation
errors
Diffstat:
| M | sled.c | | | 65 | ++++++++++++++++++++++++++++++++++++++++++++--------------------- |
измењених датотека: 1, додавања: 44(+), брисања: 21(-)
diff --git a/sled.c b/sled.c
@@ -316,8 +316,8 @@ do_search_replace(struct DrawState* state)
return 0;
do_search_replace_error:
- exit(print_error(ENOMEM, "Memory allocation failed"));
- /* Unreachable */
+ MEMCCPY(state->error, errors[ERR_CANT_ALLOC], LINE_DEFAULT, temp);
+ state->running = 0;
return 1;
}
@@ -408,20 +408,22 @@ static int
erase_line(struct DrawState* state)
{
struct BufferLine* current = NULL;
+ struct BufferLine* next = NULL;
+ uint32_t* ptext = NULL;
+ char* temp = NULL;
if (state->rows_count == 1)
{
*state->buffer[0].text = 0;
state->buffer[0].length = 0;
return 0;
}
- free(state->buffer[state->coord.row].text);
- state->buffer[state->coord.row].text = NULL;
for (ssize_t row = state->coord.row; row < state->rows_count - 1; row++)
{
- current = state->buffer + row;
- current->text = state->buffer[row + 1].text;
- current->size = state->buffer[row + 1].size;
- current->length = state->buffer[row + 1].length;
+ current = state->buffer + row;
+ next = state->buffer + row + 1;
+ U32_SAFE_COPY(current->text, ptext, current->size, next->text,
+ next->size, erase_line_error);
+ current->length = next->length;
}
free_bufferline(&state->buffer[state->rows_count - 1]);
if ((state->coord.row + 1) == state->rows_count)
@@ -430,6 +432,11 @@ erase_line(struct DrawState* state)
state->rows_count--;
state->dirty = 1;
return 0;
+
+erase_line_error:
+ MEMCCPY(state->error, errors[ERR_CANT_ALLOC], LINE_DEFAULT, temp);
+ state->running = 0;
+ return 1;
}
static int
@@ -1023,10 +1030,11 @@ static int
insert_char(struct DrawState* state, uint32_t ch)
{
struct BufferLine* buffer_line = NULL;
+ uint32_t* ptext = NULL;
+ char* temp = NULL;
ssize_t i;
ssize_t len;
ssize_t size;
- uint32_t* ptext = NULL;
ENSURE_SIZE(state->buffer[state->coord.row].text, ptext,
state->buffer[state->coord.row].size,
@@ -1089,6 +1097,8 @@ insert_skip_wrap:
return 0;
insert_char_error:
+ MEMCCPY(state->error, errors[ERR_CANT_ALLOC], LINE_DEFAULT, temp);
+ state->running = 0;
return 1;
}
@@ -1151,16 +1161,17 @@ insert_tab(struct DrawState* state)
static int
join_lines(struct DrawState* state)
{
+ struct BufferLine* current = NULL;
+ struct BufferLine* next = NULL;
+ uint32_t* ptext = NULL;
+ char* temp = NULL;
/* Selection start row/col */
int ssr = 0;
int ssc = 0;
/* Selection end row */
- int ser = 0;
- int selection = 0;
- int saved_row = state->coord.row;
- struct BufferLine* current = NULL;
- struct BufferLine* next = NULL;
- uint32_t* ptext = NULL;
+ int ser = 0;
+ int selection = 0;
+ int saved_row = state->coord.row;
if (SEL_NOT_EMPTY(state))
{
@@ -1212,7 +1223,9 @@ join_lines(struct DrawState* state)
return 0;
join_lines_error:
- return -1;
+ MEMCCPY(state->error, errors[ERR_CANT_ALLOC], LINE_DEFAULT, temp);
+ state->running = 0;
+ return 1;
}
static int
@@ -2253,6 +2266,8 @@ simple_insert_line(struct DrawState* state)
return;
simple_insert_line_error:
+ MEMCCPY(state->error, errors[ERR_CANT_ALLOC], LINE_DEFAULT, temp);
+ state->running = 0;
return;
}
@@ -2262,6 +2277,7 @@ simple_join_lines(struct DrawState* state)
struct BufferLine* first_line = NULL;
struct BufferLine* next_line = NULL;
uint32_t* ptext = NULL;
+ char* temp = NULL;
if ((state->coord.row + 1) == state->rows_count)
return;
@@ -2289,21 +2305,24 @@ simple_join_lines(struct DrawState* state)
return;
simple_join_lines_error:
+ MEMCCPY(state->error, errors[ERR_CANT_ALLOC], LINE_DEFAULT, temp);
+ state->running = 0;
return;
}
static void
simple_yank(struct DrawState* state)
{
+ struct BufferLine* newbuf = NULL;
+ uint32_t* ptext = NULL;
+ char* temp = NULL;
+ ssize_t initialize_start;
/* Selection start row/col */
int ssr = 0;
int ssc = 0;
/* Selection end row/col */
- int ser = 0;
- int sec = 0;
- struct BufferLine* newbuf = NULL;
- ssize_t initialize_start;
- uint32_t* ptext = NULL;
+ int ser = 0;
+ int sec = 0;
if (!SEL_NOT_EMPTY(state))
{
@@ -2380,6 +2399,8 @@ simple_yank(struct DrawState* state)
return;
simple_yank_alloc_error:
+ MEMCCPY(state->error, errors[ERR_CANT_ALLOC], LINE_DEFAULT, temp);
+ state->running = 0;
return;
}
@@ -2670,6 +2691,8 @@ wrap_success:
return 0;
wrap_alloc_error:
+ MEMCCPY(state->error, errors[ERR_CANT_ALLOC], LINE_DEFAULT, temp);
+ state->running = 0;
return 1;
}