]> git.ipfire.org Git - thirdparty/git.git/commitdiff
get_sha1: detect buggy calls with multiple disambiguators
authorJeff King <peff@peff.net>
Mon, 26 Sep 2016 11:59:01 +0000 (07:59 -0400)
committerJunio C Hamano <gitster@pobox.com>
Mon, 26 Sep 2016 18:21:28 +0000 (11:21 -0700)
The get_sha1() family of functions takes a flags field, but
some of the flags are mutually exclusive. In particular, we
can only handle one disambiguating function, and the flags
quietly override each other. Let's instead detect these as
programming bugs.

Technically some of the flags are supersets of the others,
so treating COMMITTISH|TREEISH as just COMMITTISH is not
wrong, but it's a good sign the caller is confused. And
certainly asking for BLOB|TREE does not work.

We can do the check easily with some bit-twiddling, and as a
bonus, the bit-mask of disambiguators will come in handy in
a future patch.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
cache.h
sha1_name.c

diff --git a/cache.h b/cache.h
index d0494c85338b9063b3abe6e2081c921617ca0203..7bd78ca282bbf15ed1d41b7820d59e7c3a2fe7c2 100644 (file)
--- a/cache.h
+++ b/cache.h
@@ -1203,6 +1203,11 @@ struct object_context {
 #define GET_SHA1_FOLLOW_SYMLINKS 0100
 #define GET_SHA1_ONLY_TO_DIE    04000
 
+#define GET_SHA1_DISAMBIGUATORS \
+       (GET_SHA1_COMMIT | GET_SHA1_COMMITTISH | \
+       GET_SHA1_TREE | GET_SHA1_TREEISH | \
+       GET_SHA1_BLOB)
+
 extern int get_sha1(const char *str, unsigned char *sha1);
 extern int get_sha1_commit(const char *str, unsigned char *sha1);
 extern int get_sha1_committish(const char *str, unsigned char *sha1);
index faf873cf7f82b0eece69d35bb70dfd1daded6f9d..0ff83a99851ba091023cc972741aca94bd0368fd 100644 (file)
@@ -327,6 +327,10 @@ static int get_short_sha1(const char *name, int len, unsigned char *sha1,
        prepare_alt_odb();
 
        memset(&ds, 0, sizeof(ds));
+
+       if (HAS_MULTI_BITS(flags & GET_SHA1_DISAMBIGUATORS))
+               die("BUG: multiple get_short_sha1 disambiguator flags");
+
        if (flags & GET_SHA1_COMMIT)
                ds.fn = disambiguate_commit_only;
        else if (flags & GET_SHA1_COMMITTISH)