commit - 02828bfdd5b1fe79298e576b2c28d252509fa089
commit + c4330effadfe340c07b5709bc805de6a0b3764a7
blob - b724471532577da10261814ae16d983663c533c9
blob + e2c8744ffb1b9384501e83ee3f8dd3975eb806be
--- lib/got_lib_pack.h
+++ lib/got_lib_pack.h
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
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,
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");