From: Junio C Hamano Date: Thu, 28 Jul 2016 18:25:53 +0000 (-0700) Subject: Merge branch 'js/sign-empty-commit-fix' into maint X-Git-Tag: v2.9.3~57 X-Git-Url: https://git.lorimer.id.au/gitweb.git/diff_plain/475495ff5e071c895dca772cb59e277ceff84d84?ds=inline;hp=-c Merge branch 'js/sign-empty-commit-fix' into maint "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 --- 475495ff5e071c895dca772cb59e277ceff84d84 diff --combined commit.c index 24d4715f24,ee7f0cb029..2a90e37519 --- a/commit.c +++ 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) @@@ -414,7 -414,7 +414,7 @@@ 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)); } }