diff --git a/src/revparse.c b/src/revparse.c index c275b55a6..3f210d11b 100644 --- a/src/revparse.c +++ b/src/revparse.c @@ -323,10 +323,10 @@ static git_object* dereference_object(git_object *obj) break; case GIT_OBJ_TAG: { - git_object *newobj = NULL; - if (0 == git_tag_target(&newobj, (git_tag*)obj)) { - return newobj; - } + git_object *newobj = NULL; + if (0 == git_tag_target(&newobj, (git_tag*)obj)) { + return newobj; + } } break; @@ -506,8 +506,8 @@ static int handle_linear_syntax(git_object **out, git_object *obj, const char *m /* "~" is the same as "~1" */ if (*movement == '\0') { n = 1; - } else { - git__strtol32(&n, movement, NULL, 0); + } else if (git__strtol32(&n, movement, NULL, 0) < 0) { + return GIT_ERROR; } commit1 = (git_commit*)obj; @@ -581,7 +581,7 @@ static int handle_colon_syntax(git_object **out, git_tree_free(tree); if (error < 0) - return error; + return error; return git_object_lookup(out, repo, &oid, GIT_OBJ_ANY); } @@ -623,7 +623,7 @@ static int revparse_global_grep(git_object **out, git_repository *repo, const ch } if (!resultobj) { giterr_set(GITERR_REFERENCE, "Couldn't find a match for %s", pattern); - git_object_free(walkobj); + git_object_free(walkobj); } else { *out = resultobj; } diff --git a/tests-clar/refs/revparse.c b/tests-clar/refs/revparse.c index c303e1b5f..2ee72f206 100644 --- a/tests-clar/refs/revparse.c +++ b/tests-clar/refs/revparse.c @@ -104,6 +104,9 @@ void test_refs_revparse__to_type(void) void test_refs_revparse__linear_history(void) { + cl_git_fail(git_revparse_single(&g_obj, g_repo, "foo~bar")); + cl_git_fail(git_revparse_single(&g_obj, g_repo, "master~bar")); + test_object("master~0", "a65fedf39aefe402d3bb6e24df4d4f5fe4547750"); test_object("master~1", "be3563ae3f795b2b4353bcce3a527ad0a4f7f644"); test_object("master~2", "9fd738e8f7967c078dceed8190330fc8648ee56a");