From: Junio C Hamano Date: Wed, 16 Mar 2016 17:42:32 +0000 (-0700) Subject: Merge branch 'jk/path-name-safety-2.6' into jk/path-name-safety-2.7 X-Git-Tag: v2.8.0-rc3~2^2^2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=55c45a732582ca74d9f8a73c8f176d3dadd5b819;p=thirdparty%2Fgit.git Merge branch 'jk/path-name-safety-2.6' into jk/path-name-safety-2.7 * jk/path-name-safety-2.6: list-objects: pass full pathname to callbacks list-objects: drop name_path entirely list-objects: convert name_path to a strbuf show_object_with_name: simplify by using path_name() http-push: stop using name_path tree-diff: catch integer overflow in combine_diff_path allocation add helpers for detecting size_t overflow --- 55c45a732582ca74d9f8a73c8f176d3dadd5b819 diff --cc builtin/pack-objects.c index b4f1fa6d33,676727e1c6..a27de5b323 --- a/builtin/pack-objects.c +++ b/builtin/pack-objects.c @@@ -2285,21 -2284,11 +2285,11 @@@ static void show_commit(struct commit * index_commit_for_bitmap(commit); } - static void show_object(struct object *obj, - const struct name_path *path, const char *last, - void *data) + static void show_object(struct object *obj, const char *name, void *data) { - char *name = path_name(path, last); - add_preferred_base_object(name); - add_object_entry(obj->sha1, obj->type, name, 0); + add_object_entry(obj->oid.hash, obj->type, name, 0); obj->flags |= OBJECT_ADDED; - - /* - * We will have generated the hash from the name, - * but not saved a pointer to it - we can free it - */ - free((char *)name); } static void show_edge(struct commit *commit) @@@ -2481,11 -2470,10 +2471,10 @@@ static int get_object_list_from_bitmap( } static void record_recent_object(struct object *obj, - const struct name_path *path, - const char *last, + const char *name, void *data) { - sha1_array_append(&recent_objects, obj->sha1); + sha1_array_append(&recent_objects, obj->oid.hash); } static void record_recent_commit(struct commit *commit, void *data) diff --cc builtin/rev-list.c index 3aa89a1a3c,4c46341749..275da0d647 --- a/builtin/rev-list.c +++ b/builtin/rev-list.c @@@ -177,26 -177,22 +177,22 @@@ static void finish_commit(struct commi free_commit_buffer(commit); } - static void finish_object(struct object *obj, - const struct name_path *path, const char *name, - void *cb_data) + static void finish_object(struct object *obj, const char *name, void *cb_data) { struct rev_list_info *info = cb_data; - if (obj->type == OBJ_BLOB && !has_sha1_file(obj->sha1)) - die("missing blob object '%s'", sha1_to_hex(obj->sha1)); + if (obj->type == OBJ_BLOB && !has_object_file(&obj->oid)) + die("missing blob object '%s'", oid_to_hex(&obj->oid)); if (info->revs->verify_objects && !obj->parsed && obj->type != OBJ_COMMIT) - parse_object(obj->sha1); + parse_object(obj->oid.hash); } - static void show_object(struct object *obj, - const struct name_path *path, const char *component, - void *cb_data) + static void show_object(struct object *obj, const char *name, void *cb_data) { struct rev_list_info *info = cb_data; - finish_object(obj, path, component, cb_data); + finish_object(obj, name, cb_data); if (info->flags & REV_LIST_QUIET) return; - show_object_with_name(stdout, obj, path, component); + show_object_with_name(stdout, obj, name); } static void show_edge(struct commit *commit) diff --cc http-push.c index d857b131a8,834190941e..bd60668707 --- a/http-push.c +++ b/http-push.c @@@ -1307,14 -1301,10 +1302,10 @@@ static struct object_list **process_tre if (obj->flags & (UNINTERESTING | SEEN)) return p; if (parse_tree(tree) < 0) - die("bad tree object %s", sha1_to_hex(obj->sha1)); + die("bad tree object %s", oid_to_hex(&obj->oid)); obj->flags |= SEEN; - name = xstrdup(name); p = add_one_object(obj, p); - me.up = path; - me.elem = name; - me.elem_len = strlen(name); init_tree_desc(&desc, tree->buffer, tree->size); @@@ -1366,10 -1356,10 +1357,10 @@@ static int get_delta(struct rev_info *r continue; } if (obj->type == OBJ_BLOB) { - p = process_blob((struct blob *)obj, p, NULL, name); + p = process_blob((struct blob *)obj, p); continue; } - die("unknown pending object %s (%s)", sha1_to_hex(obj->sha1), name); + die("unknown pending object %s (%s)", oid_to_hex(&obj->oid), name); } while (objects) { diff --cc list-objects.c index 11732d9388,37d0d10ab2..917cc5d7c9 --- a/list-objects.c +++ b/list-objects.c @@@ -84,19 -87,14 +87,14 @@@ static void process_tree(struct rev_inf if (parse_tree_gently(tree, revs->ignore_missing_links) < 0) { if (revs->ignore_missing_links) return; - die("bad tree object %s", sha1_to_hex(obj->sha1)); + die("bad tree object %s", oid_to_hex(&obj->oid)); } + obj->flags |= SEEN; - show(obj, path, name, cb_data); - me.up = path; - me.elem = name; - me.elem_len = strlen(name); - - if (!match) { - strbuf_addstr(base, name); - if (base->len) - strbuf_addch(base, '/'); - } + strbuf_addstr(base, name); + show(obj, base->buf, cb_data); + if (base->len) + strbuf_addch(base, '/'); init_tree_desc(&desc, tree->buffer, tree->size); diff --cc pack-bitmap-write.c index 6bff970c90,b2f6cb537c..c30bcd06cb --- a/pack-bitmap-write.c +++ b/pack-bitmap-write.c @@@ -148,11 -148,10 +148,10 @@@ static uint32_t find_object_pos(const u return entry->in_pack_pos; } - static void show_object(struct object *object, const struct name_path *path, - const char *last, void *data) + static void show_object(struct object *object, const char *name, void *data) { struct bitmap *base = data; - bitmap_set(base, find_object_pos(object->sha1)); + bitmap_set(base, find_object_pos(object->oid.hash)); mark_as_seen(object); } diff --cc pack-bitmap.c index cb9c622803,aee7acf392..d92394692e --- a/pack-bitmap.c +++ b/pack-bitmap.c @@@ -423,13 -427,10 +422,10 @@@ static void show_object(struct object * struct bitmap *base = data; int bitmap_pos; - bitmap_pos = bitmap_position(object->sha1); + bitmap_pos = bitmap_position(object->oid.hash); - if (bitmap_pos < 0) { - char *name = path_name(path, last); + if (bitmap_pos < 0) bitmap_pos = ext_index_add_object(object, name); - free(name); - } bitmap_set(base, bitmap_pos); } diff --cc revision.c index df56fcea0e,8435ce5256..224ed1961a --- a/revision.c +++ b/revision.c @@@ -25,69 -25,13 +25,13 @@@ volatile show_early_output_fn_t show_ea static const char *term_bad; static const char *term_good; - char *path_name(const struct name_path *path, const char *name) + void show_object_with_name(FILE *out, struct object *obj, const char *name) { - const struct name_path *p; - char *n, *m; - int nlen = strlen(name); - int len = nlen + 1; - - for (p = path; p; p = p->up) { - if (p->elem_len) - len += p->elem_len + 1; - } - n = xmalloc(len); - m = n + len - (nlen + 1); - memcpy(m, name, nlen + 1); - for (p = path; p; p = p->up) { - if (p->elem_len) { - m -= p->elem_len + 1; - memcpy(m, p->elem, p->elem_len); - m[p->elem_len] = '/'; - } - } - return n; - } - - static int show_path_component_truncated(FILE *out, const char *name, int len) - { - int cnt; - for (cnt = 0; cnt < len; cnt++) { - int ch = name[cnt]; - if (!ch || ch == '\n') - return -1; - fputc(ch, out); - } - return len; - } - - static int show_path_truncated(FILE *out, const struct name_path *path) - { - int emitted, ours; - - if (!path) - return 0; - emitted = show_path_truncated(out, path->up); - if (emitted < 0) - return emitted; - if (emitted) - fputc('/', out); - ours = show_path_component_truncated(out, path->elem, path->elem_len); - if (ours < 0) - return ours; - return ours || emitted; - } - - void show_object_with_name(FILE *out, struct object *obj, - const struct name_path *path, const char *component) - { - struct name_path leaf; - leaf.up = (struct name_path *)path; - leaf.elem = component; - leaf.elem_len = strlen(component); + const char *p; - fprintf(out, "%s ", sha1_to_hex(obj->sha1)); + fprintf(out, "%s ", oid_to_hex(&obj->oid)); - show_path_truncated(out, &leaf); + for (p = name; *p && *p != '\n'; p++) + fputc(*p, out); fputc('\n', out); }