[PATCH v4 0/4] Fix git-last-modified(1) bug triggered when passing a tree-ish
- From
Toon Claes <toon@iotcl.com>
- Date
- Jan 23, 2026, 14:33 UTC
- Message-ID
- <20260123-toon-last-modified-tree-v4-0-86bf97bad4e2@iotcl.com>
- In-Reply-To
- <20260116-toon-last-modified-tree-v3-0-e6ade4dc35ab@iotcl.com>
Recently there was a bug reported[1] passing a tree OID triggers a BUG:
$ git last-modified fb06ce04173d47aaaa498385621cba8b8dfd7584
BUG: builtin/last-modified.c:456: paths remaining beyond boundary in last-modified
[1] 690163 IOT instruction (core dumped) git last-modified `fb06ce04173d47aaaa498385621cba8b8dfd7584` is the tree commit id of web_src. I
suppose this should've returned a nice error message or blank output.Fix this bug by checking the revision argument.
[1]: https://lore.kernel.org/git/03f96860-29fc-42a7-a220-c3ec65eb8516@codeberg.org/
--- Changes in v4: - Extend the error message when revision is not a tree - Extend the test to verify the error message when more than one revision is given. - Link to v3: https://patch.msgid.link/20260116-toon-last-modified-tree-v3-0-e6ade4dc35ab@iotcl.com
Changes in v3: - Split the change to plug the leak into a separate commit. - Small changes to commit messages. - Link to v2: https://patch.msgid.link/20260114-toon-last-modified-tree-v2-0-ba3b1860898f@iotcl.com
Changes in v2: - Prepend the change with a commit that modifies the error message when more than one revision is given. - Prepend another commit that removes double error message. - Add test to ensure the command works with annotated tags too. - Link to v1: https://patch.msgid.link/20260112-toon-last-modified-tree-v1-1-ecbc78341f76@iotcl.com
---
Toon Claes (4):
last-modified: rewrite error message when more than one revision given
last-modified: fix memory leak when more than one revision is given
last-modified: remove double error message
last-modified: verify revision argument is a commit-ishbuiltin/last-modified.c | 19 ++++++++++++++----- t/t8020-last-modified.sh | 24 +++++++++++++++++++----- 2 files changed, 33 insertions(+), 10 deletions(-)
Range-diff versus v3:
1: 8786f5d6a4 ! 1: 1bd4bb7cb8 last-modified: rewrite error message when more than one revision given
@@ Commit message
error: last-modified can only operate on one revision at a time
+ While at it, ensure modify the test to ensure the correct error message
+ is printed.
+
Signed-off-by: Toon Claes <toon@iotcl.com>
## builtin/last-modified.c ##
@@ t/t8020-last-modified.sh: test_expect_success 'setup' '
'
-test_expect_success 'cannot run last-modified on two trees' '
+- test_must_fail git last-modified HEAD HEAD~1
+-'
+-
+ check_last_modified() {
+ local indir= &&
+ while test $# != 0
+@@ t/t8020-last-modified.sh: test_expect_success 'last-modified merge undoes changes' '
+ EOF
+ '
+
+test_expect_success 'cannot run last-modified on two revision' '
- test_must_fail git last-modified HEAD HEAD~1
++ test_must_fail git last-modified HEAD HEAD~1 2>err &&
++ test_grep "last-modified can only operate on one revision at a time" err
++'
++
+ test_expect_success 'last-modified complains about unknown arguments' '
+ test_must_fail git last-modified --foo 2>err &&
+- grep "unknown last-modified argument: --foo" err
++ test_grep "unknown last-modified argument: --foo" err
'
+ test_done
2: 78ec93a9e2 = 2: ed1bd102a2 last-modified: fix memory leak when more than one revision is given
3: 05b4424289 = 3: 7a6e587da1 last-modified: remove double error message
4: 00e29cd6a1 ! 4: fee3aa92a9 last-modified: verify revision argument is a commit-ish
@@ builtin/last-modified.c: static int populate_paths_from_revs(struct last_modifie
}
+ if (!repo_peel_to_type(lm->rev.repo, obj->path, 0, obj->item, OBJ_COMMIT)) {
-+ ret = error(_("revision argument is not a commit-ish"));
++ ret = error(_("revision argument '%s' is a %s, not a commit-ish"), obj->name, type_name(obj->item->type));
+ goto out;
+ }
+
@@ t/t8020-last-modified.sh: test_expect_success 'last-modified recursive' '
check_last_modified -r -t <<-\EOF
3 a/b
@@ t/t8020-last-modified.sh: test_expect_success 'last-modified complains about unknown arguments' '
- grep "unknown last-modified argument: --foo" err
+ test_grep "unknown last-modified argument: --foo" err
'
+test_expect_success 'last-modified expects commit-ish' '
+ test_must_fail git last-modified HEAD^{tree} 2>err &&
-+ grep "revision argument is not a commit-ish" err
++ grep "revision argument '"'"'HEAD^{tree}'"'"' is a tree, not a commit-ish" err
+'
+
test_done--- base-commit: 7264e61d87e58b9d0f5e6424c47c11e9657dfb75 change-id: 20260112-toon-last-modified-tree-fdd96b2feaf7