чување 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:
измењених датотека: 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;
}