pack-objects: don't check size when the object is bad
authorNguyễn Thái Ngọc Duy <pclouds@gmail.com>
Sat, 14 Apr 2018 15:35:08 +0000 (17:35 +0200)
committerJunio C Hamano <gitster@pobox.com>
Mon, 16 Apr 2018 03:38:58 +0000 (12:38 +0900)
sha1_object_info() in check_objects() may fail to locate an object in
the pack and return type OBJ_BAD. In that case, it will likely leave
the "size" field untouched. We delay error handling until later in
prepare_pack() though. Until then, do not touch "size" field.

This field should contain the default value zero, but we can't say
sha1_object_info() cannot damage it. This becomes more important later
when the object size may have to be retrieved back from the
(non-existing) pack.

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/pack-objects.c

index 211bb1a..e756931 100644 (file)
@@ -1742,7 +1742,7 @@ static void get_object_details(void)
        for (i = 0; i < to_pack.nr_objects; i++) {
                struct object_entry *entry = sorted_by_offset[i];
                check_object(entry);
        for (i = 0; i < to_pack.nr_objects; i++) {
                struct object_entry *entry = sorted_by_offset[i];
                check_object(entry);
-               if (big_file_threshold < entry->size)
+               if (entry->type_valid && big_file_threshold < entry->size)
                        entry->no_try_delta = 1;
        }
 
                        entry->no_try_delta = 1;
        }
 
@@ -2453,7 +2453,7 @@ static void prepare_pack(int window, int depth)
                         */
                        continue;
 
                         */
                        continue;
 
-               if (entry->size < 50)
+               if (!entry->type_valid || entry->size < 50)
                        continue;
 
                if (entry->no_try_delta)
                        continue;
 
                if (entry->no_try_delta)