Signed-off-by: Nguyễn Thái Ngọc Duy <pclo...@gmail.com>
---
 builtin/unpack-objects.c | 25 ++++++++++++++++++++++---
 1 file changed, 22 insertions(+), 3 deletions(-)

diff --git a/builtin/unpack-objects.c b/builtin/unpack-objects.c
index a906a98..f8442f4 100644
--- a/builtin/unpack-objects.c
+++ b/builtin/unpack-objects.c
@@ -23,6 +23,7 @@ static off_t consumed_bytes;
 static git_SHA_CTX ctx;
 
 static int packv4;
+static unsigned nr_objects;
 static unsigned char *sha1_table;
 static struct packv4_dict *name_dict, *path_dict;
 
@@ -115,6 +116,21 @@ static uintmax_t read_varint(void)
        return val;
 }
 
+static const unsigned char *read_sha1ref(void)
+{
+       unsigned int index = read_varint();
+       if (!index) {
+               static unsigned char sha1[20];
+               hashcpy(sha1, fill_and_use(20));
+               return sha1;
+       }
+       index--;
+       if (index >= nr_objects)
+               die("bad index in read_sha1ref at %lu",
+                   (unsigned long)consumed_bytes);
+       return sha1_table + index * 20;
+}
+
 static void *get_data(unsigned long size)
 {
        git_zstream stream;
@@ -185,7 +201,6 @@ struct obj_info {
 #define FLAG_WRITTEN (1u<<21)
 
 static struct obj_info *obj_list;
-static unsigned nr_objects;
 
 /*
  * Called only from check_object() after it verified this object
@@ -361,8 +376,12 @@ static void unpack_delta_entry(enum object_type type, 
unsigned long delta_size,
        unsigned char base_sha1[20];
 
        if (type == OBJ_REF_DELTA) {
-               hashcpy(base_sha1, fill(20));
-               use(20);
+               if (packv4)
+                       hashcpy(base_sha1, read_sha1ref());
+               else {
+                       hashcpy(base_sha1, fill(20));
+                       use(20);
+               }
                delta_data = get_data(delta_size);
                if (dry_run || !delta_data) {
                        free(delta_data);
-- 
1.8.2.82.gc24b958

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to