Merge branch 'js/sign-empty-commit-fix' into maint
authorJunio C Hamano <gitster@pobox.com>
Thu, 28 Jul 2016 18:25:53 +0000 (11:25 -0700)
committerJunio C Hamano <gitster@pobox.com>
Thu, 28 Jul 2016 18:25:53 +0000 (11:25 -0700)
"git commit --amend --allow-empty-message -S" for a commit without
any message body could have misidentified where the header of the
commit object ends.

* js/sign-empty-commit-fix:
commit -S: avoid invalid pointer with empty message

1  2 
commit.c
diff --combined commit.c
index 24d4715f24f06c4747eb728ffbdab2aadf715e6a,ee7f0cb029b1a777972ed9efcf9bbabdc2a655c8..2a90e37519f0b6e9de6e30ed57afe91822441ca3
+++ b/commit.c
@@@ -38,7 -38,7 +38,7 @@@ struct commit *lookup_commit_or_die(con
        struct commit *c = lookup_commit_reference(sha1);
        if (!c)
                die(_("could not parse %s"), ref_name);
 -      if (hashcmp(sha1, c->object.sha1)) {
 +      if (hashcmp(sha1, c->object.oid.hash)) {
                warning(_("%s %s is not a commit!"),
                        ref_name, sha1_to_hex(sha1));
        }
@@@ -147,7 -147,7 +147,7 @@@ struct commit_graft *read_graft_line(ch
        if ((len + 1) % entry_size)
                goto bad_graft_data;
        i = (len + 1) / entry_size - 1;
 -      graft = xmalloc(sizeof(*graft) + GIT_SHA1_RAWSZ * i);
 +      graft = xmalloc(st_add(sizeof(*graft), st_mult(GIT_SHA1_RAWSZ, i)));
        graft->nr_parent = i;
        if (get_oid_hex(buf, &graft->oid))
                goto bad_graft_data;
@@@ -262,13 -262,13 +262,13 @@@ const void *get_commit_buffer(const str
        if (!ret) {
                enum object_type type;
                unsigned long size;
 -              ret = read_sha1_file(commit->object.sha1, &type, &size);
 +              ret = read_sha1_file(commit->object.oid.hash, &type, &size);
                if (!ret)
                        die("cannot read commit object %s",
 -                          sha1_to_hex(commit->object.sha1));
 +                          oid_to_hex(&commit->object.oid));
                if (type != OBJ_COMMIT)
                        die("expected commit for %s, got %s",
 -                          sha1_to_hex(commit->object.sha1), typename(type));
 +                          oid_to_hex(&commit->object.oid), typename(type));
                if (sizep)
                        *sizep = size;
        }
@@@ -327,22 -327,22 +327,22 @@@ int parse_commit_buffer(struct commit *
        tail += size;
        if (tail <= bufptr + tree_entry_len + 1 || memcmp(bufptr, "tree ", 5) ||
                        bufptr[tree_entry_len] != '\n')
 -              return error("bogus commit object %s", sha1_to_hex(item->object.sha1));
 +              return error("bogus commit object %s", oid_to_hex(&item->object.oid));
        if (get_sha1_hex(bufptr + 5, parent.hash) < 0)
                return error("bad tree pointer in commit %s",
 -                           sha1_to_hex(item->object.sha1));
 +                           oid_to_hex(&item->object.oid));
        item->tree = lookup_tree(parent.hash);
        bufptr += tree_entry_len + 1; /* "tree " + "hex sha1" + "\n" */
        pptr = &item->parents;
  
 -      graft = lookup_commit_graft(item->object.sha1);
 +      graft = lookup_commit_graft(item->object.oid.hash);
        while (bufptr + parent_entry_len < tail && !memcmp(bufptr, "parent ", 7)) {
                struct commit *new_parent;
  
                if (tail <= bufptr + parent_entry_len + 1 ||
                    get_sha1_hex(bufptr + 7, parent.hash) ||
                    bufptr[parent_entry_len] != '\n')
 -                      return error("bad parents in commit %s", sha1_to_hex(item->object.sha1));
 +                      return error("bad parents in commit %s", oid_to_hex(&item->object.oid));
                bufptr += parent_entry_len + 1;
                /*
                 * The clone is shallow if nr_parent < 0, and we must
@@@ -380,15 -380,15 +380,15 @@@ int parse_commit_gently(struct commit *
                return -1;
        if (item->object.parsed)
                return 0;
 -      buffer = read_sha1_file(item->object.sha1, &type, &size);
 +      buffer = read_sha1_file(item->object.oid.hash, &type, &size);
        if (!buffer)
                return quiet_on_missing ? -1 :
                        error("Could not read %s",
 -                           sha1_to_hex(item->object.sha1));
 +                           oid_to_hex(&item->object.oid));
        if (type != OBJ_COMMIT) {
                free(buffer);
                return error("Object %s not a commit",
 -                           sha1_to_hex(item->object.sha1));
 +                           oid_to_hex(&item->object.oid));
        }
        ret = parse_commit_buffer(item, buffer, size);
        if (save_commit_buffer && !ret) {
@@@ -403,7 -403,7 +403,7 @@@ void parse_commit_or_die(struct commit 
  {
        if (parse_commit(item))
                die("unable to parse commit %s",
 -                  item ? sha1_to_hex(item->object.sha1) : "(null)");
 +                  item ? oid_to_hex(&item->object.oid) : "(null)");
  }
  
  int find_commit_subject(const char *commit_buffer, const char **subject)
        while (*p && (*p != '\n' || p[1] != '\n'))
                p++;
        if (*p) {
 -              p += 2;
 +              p = skip_blank_lines(p + 2);
                for (eol = p; *eol && *eol != '\n'; eol++)
                        ; /* do nothing */
        } else
@@@ -563,7 -563,7 +563,7 @@@ void clear_commit_marks_for_object_arra
  
        for (i = 0; i < a->nr; i++) {
                object = a->objects[i].item;
 -              commit = lookup_commit_reference_gently(object->sha1, 1);
 +              commit = lookup_commit_reference_gently(object->oid.hash, 1);
                if (commit)
                        clear_commit_marks(commit, mark);
        }
@@@ -903,7 -903,7 +903,7 @@@ static int remove_redundant(struct comm
  
        work = xcalloc(cnt, sizeof(*work));
        redundant = xcalloc(cnt, 1);
 -      filled_index = xmalloc(sizeof(*filled_index) * (cnt - 1));
 +      ALLOC_ARRAY(filled_index, cnt - 1);
  
        for (i = 0; i < cnt; i++)
                parse_commit(array[i]);
@@@ -1092,9 -1092,14 +1092,14 @@@ static int do_sign_commit(struct strbu
  {
        struct strbuf sig = STRBUF_INIT;
        int inspos, copypos;
+       const char *eoh;
  
        /* find the end of the header */
-       inspos = strstr(buf->buf, "\n\n") - buf->buf + 1;
+       eoh = strstr(buf->buf, "\n\n");
+       if (!eoh)
+               inspos = buf->len;
+       else
+               inspos = eoh - buf->buf + 1;
  
        if (!keyid || !*keyid)
                keyid = get_signing_key();
@@@ -1206,7 -1211,7 +1211,7 @@@ static void handle_signed_tag(struct co
        desc = merge_remote_util(parent);
        if (!desc || !desc->obj)
                return;
 -      buf = read_sha1_file(desc->obj->sha1, &type, &size);
 +      buf = read_sha1_file(desc->obj->oid.hash, &type, &size);
        if (!buf || type != OBJ_TAG)
                goto free_return;
        len = parse_signature(buf, size);
@@@ -1539,7 -1544,7 +1544,7 @@@ int commit_tree_extended(const char *ms
        while (parents) {
                struct commit *parent = pop_commit(&parents);
                strbuf_addf(&buffer, "parent %s\n",
 -                          sha1_to_hex(parent->object.sha1));
 +                          oid_to_hex(&parent->object.oid));
        }
  
        /* Person/date information */
@@@ -1623,7 -1628,7 +1628,7 @@@ void print_commit_list(struct commit_li
  {
        for ( ; list; list = list->next) {
                const char *format = list->next ? format_cur : format_last;
 -              printf(format, sha1_to_hex(list->item->object.sha1));
 +              printf(format, oid_to_hex(&list->item->object.oid));
        }
  }