load_subtree(): check earlier whether an internal node is a tree entry
authorMichael Haggerty <mhagger@alum.mit.edu>
Sat, 26 Aug 2017 08:28:06 +0000 (10:28 +0200)
committerJunio C Hamano <gitster@pobox.com>
Sat, 26 Aug 2017 16:21:01 +0000 (09:21 -0700)
If an entry is not a tree entry, then it cannot possibly be an
internal node. But the old code checked this condition only after
allocating a leaf_node object and therefore leaked that memory.
Instead, check before even entering this branch of the code.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
notes.c
diff --git a/notes.c b/notes.c
index 5be570e398742b8c2a6ca53bfcc1c6cdc5a17e78..61a5001fc069debdff9bffe453a0ae000eac5319 100644 (file)
--- a/notes.c
+++ b/notes.c
@@ -449,6 +449,11 @@ static void load_subtree(struct notes_tree *t, struct leaf_node *subtree,
                        oidcpy(&l->val_oid, entry.oid);
                } else if (path_len == 2) {
                        /* This is potentially an internal node */
+
+                       if (!S_ISDIR(entry.mode))
+                               /* internal nodes must be trees */
+                               goto handle_non_note;
+
                        if (get_oid_hex_segment(entry.path, 2,
                                                object_oid.hash + prefix_len,
                                                GIT_SHA1_RAWSZ - prefix_len) < 0)
@@ -459,8 +464,6 @@ static void load_subtree(struct notes_tree *t, struct leaf_node *subtree,
                                xcalloc(1, sizeof(struct leaf_node));
                        oidcpy(&l->key_oid, &object_oid);
                        oidcpy(&l->val_oid, entry.oid);
-                       if (!S_ISDIR(entry.mode))
-                               goto handle_non_note; /* not subtree */
                        l->key_oid.hash[KEY_INDEX] = (unsigned char) (prefix_len + 1);
                } else {
                        /* This can't be part of a note */