sled

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

чување 7b8853fd948bff478c6585488e369f7bdad72bc9
родитељ f129b454de2a42b83ee4bbe1a901ec6a695f2a0b
Аутор: Страхиња Радић <contact@strahinja.org>
Датум:   Sat,  8 Jun 2024 15:39:15 +0200

Bugfix: prev_match size_t decrement overflow which lead to segfault

Diffstat:
MTODO.done | 5+++--
Msled.c | 12+++++++++---
измењених датотека: 2, додавања: 12(+), брисања: 5(-)

diff --git a/TODO.done b/TODO.done @@ -27,13 +27,14 @@ improperly <change file~ mtime?> / only way to appease crontab -e write to file -[/] Investigate segfault: +[x] Investigate segfault: sled README C-\ G /backup N - - Can't reproduce it + - Can't reproduce it + - Fixed 2024-06-08 (size_t decrement bug) [x] Migrate from using MANDIR to using MANPREFIX like suckless programs ex: diff --git a/sled.c b/sled.c @@ -1986,12 +1986,15 @@ prev_match(struct DrawState* state) struct BufferLine* current = NULL; const uint32_t* found = NULL; size_t idelta; + size_t row; if (!state->search || !*state->search) return 0; *state->error = 0; - for (size_t row = state->coord.row; row >= 0; row--) + + row = state->coord.row; + while (row >= 0) { const uint32_t* save_found; current = state->buffer + row; @@ -2008,7 +2011,7 @@ prev_match(struct DrawState* state) found = u32_strrstr(current->text, state->search, found); if (found) { - idelta = found - (const uint32_t*)current->text; + idelta = found - current->text; state->saved_column = display_length(state, current->text, idelta); if (*current->text) @@ -2021,7 +2024,10 @@ prev_match(struct DrawState* state) goto prev_match_end; found = save_found - 1; goto prev_match_loop; - prev_match_end:; + prev_match_end: + if (!row) + break; + row--; } return 0; }