Download raw body.
tog: don't mark incorrect base commit in nested log views
Mark Jamsek <mark@jamsek.com> wrote: > Mark Jamsek <mark@jamsek.com> wrote: > > > > The second and third diffs contain two small albeit related fixes for > > bugs discovered during the process of writing the test: the first fixes > > a NULL pointer deref from passing a NULL s->last_displayed_entry to > > got_tree_entry_get_next() when scrolling down in a somewhat contrived > > tree view that is less than 4 lines in height; and the other diff clamps > > an s->selected assignment to 0 rather than becoming negative in the > > similarly contrived case of views less than their header and border > > lines in height (i.e., [2,5] depending on the view), which can result in > > bogus indexes displayed in the tree view header. Both diffs include a > > test covering these bugs: without the fixes, the added log test fails > > with a [-1/4] index displayed in the nested tree view header; and the > > tree test segfaults when scrolling down in the 3-line high tree view. > > > > > > ----------------------------------------------- > > commit df7caa1a7ae745e41ecee2ae1d3420a536796715 > > from: Mark Jamsek <mark@jamsek.dev> > > date: Tue Dec 31 12:45:28 2024 UTC > > > > fix NULL deref when scrolling small tog tree views down > > > > In the rare case a tree view is smaller than four lines in height, > > the last_displayed_entry is NULL. Check this condition on a scroll > > down event with j/down arrow or ^f/pgdn to guard a NULL got_tree_entry > > from being passed to got_tree_entry_get_next() where it is dereferenced. > > And add a test case covering this path. > > > > fix a pasto in this diff: revised diff below: Let's try that again with the right fix this time :) commit 9b234aafe57408c4499430093c09448abfc118fb from: Mark Jamsek <mark@jamsek.dev> date: Tue Dec 31 13:10:33 2024 UTC fix NULL deref when scrolling small tog tree views down In the rare case a tree view is smaller than four lines in height, the last_displayed_entry is NULL. Check this condition on a scroll down event with j/down arrow or ^f/pgdn to guard a NULL got_tree_entry from being passed to got_tree_entry_get_next() where it is dereferenced. And add a test case covering this path. M regress/tog/tree.sh | 33+ 0- M tog/tog.c | 4+ 2- 2 files changed, 37 insertions(+), 2 deletions(-) commit - ece1c9be5bbce981c493f47522d70ed1a1355a03 commit + 9b234aafe57408c4499430093c09448abfc118fb blob - 0fcbbd78a8afe17bd2f12a187cecec268453d4ea blob + 381950ee222f7b284d4a41b67b5b08dde376678a --- regress/tog/tree.sh +++ regress/tog/tree.sh @@ -341,9 +341,42 @@ test_tree_commit_keywords() test_done "$testroot" "$ret" } +test_tree_insufficient_height() +{ + test_init tree_insufficient_height 120 3 + + local id=$(git_show_head $testroot/repo) + + # Cover the path that guards a NULL dereference when scrolling + # down in a tree view too small to display any tree entries. + cat <<-EOF >$TOG_TEST_SCRIPT + j attempt to scroll down + f + SCREENDUMP + EOF + + cat <<-EOF >$testroot/view.expected + commit $id + [1/4] / + + EOF + + cd $testroot/repo && tog tree + cmp -s $testroot/view.expected $testroot/view + ret=$? + if [ $ret -ne 0 ]; then + diff -u $testroot/view.expected $testroot/view + test_done "$testroot" "$ret" + return 1 + fi + + test_done "$testroot" "$ret" +} + test_parseargs "$@" run_test test_tree_basic run_test test_tree_vsplit_blame run_test test_tree_hsplit_blame run_test test_tree_symlink run_test test_tree_commit_keywords +run_test test_tree_insufficient_height blob - e31dd5f281a3090496215529ba601df0b1b29849 blob + e8031edb015e8f848ba06221e89e864108afdd00 --- tog/tog.c +++ tog/tog.c @@ -9671,7 +9671,8 @@ input_tree_view(struct tog_view **new_view, struct tog s->selected++; break; } - if (got_tree_entry_get_next(s->tree, s->last_displayed_entry) + if (s->last_displayed_entry == NULL || + got_tree_entry_get_next(s->tree, s->last_displayed_entry) == NULL) { /* can't scroll any further */ view->count = 0; @@ -9687,7 +9688,8 @@ input_tree_view(struct tog_view **new_view, struct tog case CTRL('f'): case 'f': case ' ': - if (got_tree_entry_get_next(s->tree, s->last_displayed_entry) + if (s->last_displayed_entry == NULL || + got_tree_entry_get_next(s->tree, s->last_displayed_entry) == NULL) { /* can't scroll any further; move cursor down */ if (s->selected < s->ndisplayed - 1) -- Mark Jamsek <https://bsdbox.org> GPG: F2FF 13DE 6A06 C471 CA80 E6E2 2930 DC66 86EE CF68
tog: don't mark incorrect base commit in nested log views