Commit Diff


commit - 02828bfdd5b1fe79298e576b2c28d252509fa089
commit + c4330effadfe340c07b5709bc805de6a0b3764a7
blob - b724471532577da10261814ae16d983663c533c9
blob + e2c8744ffb1b9384501e83ee3f8dd3975eb806be
--- lib/got_lib_pack.h
+++ lib/got_lib_pack.h
@@ -28,6 +28,8 @@ const struct got_error *got_pack_close(struct got_pack
 
 const struct got_error *got_pack_parse_offset_delta(off_t *, size_t *,
     struct got_pack *, off_t, int);
+const struct got_error *got_pack_parse_ref_delta(struct got_object_id *,
+    struct got_pack *, off_t, int);
 const struct got_error *got_pack_resolve_delta_chain(struct got_delta_chain *,
     struct got_packidx *, struct got_pack *, off_t, size_t, int, size_t,
     unsigned int);
blob - eb5f6b49d6a70c08668c91709236f37b0e9f6e6a
blob + 1b917035bd5fcddb3547066f98679b2ba7a6c567
--- lib/pack.c
+++ lib/pack.c
@@ -808,7 +808,26 @@ resolve_offset_delta(struct got_delta_chain *deltas,
 	return got_pack_resolve_delta_chain(deltas, packidx, pack, base_offset,
 	    base_tslen, base_type, base_size, recursion - 1);
 }
+
+const struct got_error *
+got_pack_parse_ref_delta(struct got_object_id *id,
+    struct got_pack *pack, off_t delta_offset, int tslen)
+{
+	if (pack->map) {
+		size_t mapoff = delta_offset + tslen;
+		memcpy(id, pack->map + mapoff, sizeof(*id));
+	} else {
+		ssize_t n;
+		n = read(pack->fd, id, sizeof(*id));
+		if (n < 0)
+			return got_error_from_errno("read");
+		if (n != sizeof(*id))
+			return got_error(GOT_ERR_BAD_PACKFILE);
+	}
 
+	return NULL;
+}
+
 static const struct got_error *
 resolve_ref_delta(struct got_delta_chain *deltas, struct got_packidx *packidx,
     struct got_pack *pack, off_t delta_offset, size_t tslen, int delta_type,
@@ -826,18 +845,12 @@ resolve_ref_delta(struct got_delta_chain *deltas, stru
 	if (delta_offset + tslen >= pack->filesize)
 		return got_error(GOT_ERR_PACK_OFFSET);
 
+	err = got_pack_parse_ref_delta(&id, pack, delta_offset, tslen);
+	if (err)
+		return err;
 	if (pack->map) {
-		size_t mapoff = delta_offset + tslen;
-		memcpy(&id, pack->map + mapoff, sizeof(id));
-		mapoff += sizeof(id);
-		delta_data_offset = (off_t)mapoff;
+		delta_data_offset = delta_offset + tslen + sizeof(id);
 	} else {
-		ssize_t n;
-		n = read(pack->fd, &id, sizeof(id));
-		if (n < 0)
-			return got_error_from_errno("read");
-		if (n != sizeof(id))
-			return got_error(GOT_ERR_BAD_PACKFILE);
 		delta_data_offset = lseek(pack->fd, 0, SEEK_CUR);
 		if (delta_data_offset == -1)
 			return got_error_from_errno("lseek");