Merge branch 'jk/path-name-safety-2.6' into jk/path-name-safety-2.7
authorJunio C Hamano <gitster@pobox.com>
Wed, 16 Mar 2016 17:42:32 +0000 (10:42 -0700)
committerJunio C Hamano <gitster@pobox.com>
Wed, 16 Mar 2016 17:42:32 +0000 (10:42 -0700)
* 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

1  2 
builtin/pack-objects.c
builtin/rev-list.c
http-push.c
list-objects.c
pack-bitmap-write.c
pack-bitmap.c
revision.c
revision.h
index b4f1fa6d3396f7b8845216bc99d1aaa243d3e518,676727e1c6fadfb40d4c6586167ec9ca87970c46..a27de5b323f3fc7852a48fdc6de99414e8005c10
@@@ -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)
index 3aa89a1a3cd951afdb97cf1fe371404fc96bca8d,4c46341749ae4a2a8eb90af81b7b1fc4bfcf2c90..275da0d647ebe147386c69683cc75f2d06105d23
@@@ -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 d857b131a8f7b02e3120900c5a4e525d9f8de591,834190941e14574975eca7887280dc8ee24d9ef0..bd60668707b956160edd9fb22767758023571ebb
@@@ -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 11732d93883ee6af8990ad311d07f28028af9876,37d0d10ab2b9b512c9da7b44ae0f275e755fd8d6..917cc5d7c9ee04d07199f18b78342b84c0375fcd
@@@ -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);
  
index 6bff970c905b6a9c8a04773d64afb164dd124cbe,b2f6cb537cc8ddbeb124ca07a940e5e405e7c761..c30bcd06cbd516eb04e9b55b27b5f091ede61439
@@@ -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 cb9c62280389cfdb3bcaf483ac4edf2f0a00969f,aee7acf39204178f605221e49c66d302ca5329aa..d92394692eec56860d0c836f31019f0e03527008
@@@ -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 df56fcea0e12a11a35414fc5e1c14d1675436671,8435ce5256217536214136767e19017671f0bd17..224ed1961a3f4e0c024e71d996d2938f07c50ca9
@@@ -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);
  }
  
diff --cc revision.h
Simple merge