commit - af9b7fee80c56b28b68b06d4452580ec51066242
commit + fc79a48d6d45b863032ca7d3a161781cc8e89f95
blob - 8c76a73674eff72a0574331795351df57050510c
blob + 2563d2de603cf0699d20c0a5f5a4144c115d5bf7
--- got/Makefile
+++ got/Makefile
DEBUG = -O0 -g
.endif
CFLAGS += -Werror -Wall -Wstrict-prototypes -Wunused-variable
+#CPLAGS += -DGOT_PACK_NO_MMAP
# For now, default to installing binary in ~/bin
GROUP!=id -g -n
blob - 856b6608a054f295377b1a15f34c5394f9f77c72
blob + a603e1a81cf8e0bd501567e926adb3470545bec8
--- lib/pack.c
+++ lib/pack.c
struct got_packidx_v2_hdr *h;
const struct got_error *err = NULL;
size_t nobj, len_fanout, len_ids, offset, remain;
+ ssize_t n;
SHA1_CTX ctx;
uint8_t sha1[SHA1_DIGEST_LENGTH];
goto done;
}
+#ifndef GOT_PACK_NO_MMAP
p->map = mmap(NULL, p->len, PROT_READ, MAP_PRIVATE, p->fd, 0);
- if (p->map == MAP_FAILED) {
- err = got_error_from_errno();
- goto done;
- }
+ if (p->map == MAP_FAILED)
+ p->map = NULL; /* fall back to read(2) */
+#endif
+
h = &p->hdr;
offset = 0;
remain = p->len;
err = got_error(GOT_ERR_BAD_PACKIDX);
goto done;
}
- h->magic = (uint32_t *)(p->map + offset);
+ if (p->map)
+ h->magic = (uint32_t *)(p->map + offset);
+ else {
+ h->magic = malloc(sizeof(*h->magic));
+ if (h->magic == NULL) {
+ err = got_error_from_errno();
+ goto done;
+ }
+ n = read(p->fd, h->magic, sizeof(*h->magic));
+ if (n != sizeof(*h->magic)) {
+ err = got_error(GOT_ERR_BAD_PACKIDX);
+ goto done;
+ }
+ }
if (betoh32(*h->magic) != GOT_PACKIDX_V2_MAGIC) {
err = got_error(GOT_ERR_BAD_PACKIDX);
goto done;
err = got_error(GOT_ERR_BAD_PACKIDX);
goto done;
}
- h->version = (uint32_t *)(p->map + offset);
+ if (p->map)
+ h->version = (uint32_t *)(p->map + offset);
+ else {
+ h->version = malloc(sizeof(*h->version));
+ if (h->version == NULL) {
+ err = got_error_from_errno();
+ goto done;
+ }
+ n = read(p->fd, h->version, sizeof(*h->version));
+ if (n != sizeof(*h->version)) {
+ err = got_error(GOT_ERR_BAD_PACKIDX);
+ goto done;
+ }
+ }
if (betoh32(*h->version) != GOT_PACKIDX_VERSION) {
err = got_error(GOT_ERR_BAD_PACKIDX);
goto done;
err = got_error(GOT_ERR_BAD_PACKIDX);
goto done;
}
- h->fanout_table = (uint32_t *)(p->map + offset);
+ if (p->map)
+ h->fanout_table = (uint32_t *)(p->map + offset);
+ else {
+ h->fanout_table = malloc(len_fanout);
+ if (h->fanout_table == NULL) {
+ err = got_error_from_errno();
+ goto done;
+ }
+ n = read(p->fd, h->fanout_table, len_fanout);
+ if (n != len_fanout) {
+ err = got_error(GOT_ERR_BAD_PACKIDX);
+ goto done;
+ }
+ }
err = verify_fanout_table(h->fanout_table);
if (err)
goto done;
err = got_error(GOT_ERR_BAD_PACKIDX);
goto done;
}
- h->sorted_ids =
- (struct got_packidx_object_id *)((uint8_t*)(p->map + offset));
+ if (p->map)
+ h->sorted_ids =
+ (struct got_packidx_object_id *)((uint8_t*)(p->map + offset));
+ else {
+ h->sorted_ids = malloc(len_ids);
+ if (h->sorted_ids == NULL) {
+ err = got_error(GOT_ERR_BAD_PACKIDX);
+ goto done;
+ }
+ n = read(p->fd, h->sorted_ids, len_ids);
+ if (n != len_ids) {
+ err = got_error(GOT_ERR_BAD_PACKIDX);
+ goto done;
+ }
+ }
if (verify)
SHA1Update(&ctx, (uint8_t *)h->sorted_ids, len_ids);
offset += len_ids;
err = got_error(GOT_ERR_BAD_PACKIDX);
goto done;
}
- h->crc32 = (uint32_t *)((uint8_t*)(p->map + offset));
+ if (p->map)
+ h->crc32 = (uint32_t *)((uint8_t*)(p->map + offset));
+ else {
+ h->crc32 = malloc(nobj * sizeof(*h->crc32));
+ if (h->crc32 == NULL) {
+ err = got_error_from_errno();
+ goto done;
+ }
+ n = read(p->fd, h->crc32, nobj * sizeof(*h->crc32));
+ if (n != nobj * sizeof(*h->crc32)) {
+ err = got_error(GOT_ERR_BAD_PACKIDX);
+ goto done;
+ }
+ }
if (verify)
SHA1Update(&ctx, (uint8_t *)h->crc32, nobj * sizeof(*h->crc32));
remain -= nobj * sizeof(*h->crc32);
err = got_error(GOT_ERR_BAD_PACKIDX);
goto done;
}
- h->offsets = (uint32_t *)((uint8_t*)(p->map + offset));
+ if (p->map)
+ h->offsets = (uint32_t *)((uint8_t*)(p->map + offset));
+ else {
+ h->offsets = malloc(nobj * sizeof(*h->offsets));
+ if (h->offsets == NULL) {
+ err = got_error_from_errno();
+ goto done;
+ }
+ n = read(p->fd, h->offsets, nobj * sizeof(*h->offsets));
+ if (n != nobj * sizeof(*h->offsets)) {
+ err = got_error(GOT_ERR_BAD_PACKIDX);
+ goto done;
+ }
+ }
if (verify)
SHA1Update(&ctx, (uint8_t *)h->offsets,
nobj * sizeof(*h->offsets));
err = got_error(GOT_ERR_BAD_PACKIDX);
goto done;
}
- h->large_offsets = (uint64_t *)((uint8_t*)(p->map + offset));
+ if (p->map)
+ h->large_offsets = (uint64_t *)((uint8_t*)(p->map + offset));
+ else {
+ h->offsets = malloc(nobj * sizeof(*h->large_offsets));
+ if (h->offsets == NULL) {
+ err = got_error_from_errno();
+ goto done;
+ }
+ n = read(p->fd, h->large_offsets,
+ nobj * sizeof(*h->large_offsets));
+ if (n != nobj * sizeof(*h->large_offsets)) {
+ err = got_error(GOT_ERR_BAD_PACKIDX);
+ goto done;
+ }
+ }
if (verify)
SHA1Update(&ctx, (uint8_t*)h->large_offsets,
nobj * sizeof(*h->large_offsets));
err = got_error(GOT_ERR_BAD_PACKIDX);
goto done;
}
- h->trailer =
- (struct got_packidx_trailer *)((uint8_t*)(p->map + offset));
+ if (p->map)
+ h->trailer =
+ (struct got_packidx_trailer *)((uint8_t*)(p->map + offset));
+ else {
+ h->trailer = malloc(sizeof(*h->trailer));
+ if (h->trailer == NULL) {
+ err = got_error_from_errno();
+ goto done;
+ }
+ n = read(p->fd, h->trailer, sizeof(*h->trailer));
+ if (n != sizeof(*h->trailer)) {
+ err = got_error(GOT_ERR_BAD_PACKIDX);
+ goto done;
+ }
+ }
if (verify) {
SHA1Update(&ctx, h->trailer->packfile_sha1, SHA1_DIGEST_LENGTH);
SHA1Final(sha1, &ctx);
const struct got_error *err = NULL;
free(packidx->path_packidx);
- if (packidx->map != NULL && packidx->map != MAP_FAILED) {
+ if (packidx->map) {
if (munmap(packidx->map, packidx->len) == -1)
err = got_error_from_errno();
+ } else {
+ free(packidx->hdr.magic);
+ free(packidx->hdr.version);
+ free(packidx->hdr.fanout_table);
+ free(packidx->hdr.sorted_ids);
+ free(packidx->hdr.crc32);
+ free(packidx->hdr.offsets);
+ free(packidx->hdr.large_offsets);
+ free(packidx->hdr.trailer);
}
close(packidx->fd);
free(packidx);
blob - c8f2d7e9d3b04208321ffaa6a29020d7b147e132
blob + fff00c3507ab78c3b9aab9cca4628b60b28c94a3
--- regress/repository/Makefile
+++ regress/repository/Makefile
LDADD = -lutil -lz
DEBUG = -O0 -g
CFLAGS += -Werror -Wall -Wstrict-prototypes -Wunused-variable
+#CFLAGS += -DGOT_PACK_NO_MMAP
NOMAN = yes
blob - 4c90c64fc7ae7d0c6e12a7cfcd6aae6e59a22245
blob + 699a6f2edc3886636e3055d238df66eaf6f338fa
--- regress/worktree/Makefile
+++ regress/worktree/Makefile
LDADD = -lutil -lz
DEBUG = -O0 -g
CFLAGS += -Werror -Wall -Wstrict-prototypes -Wunused-variable
+#CFLAGS += -DGOT_PACK_NO_MMAP
NOMAN = yes
blob - f3f595818068357c40dd403d4732cde1697a36dc
blob + 636134505907c48c61f1d68a1f39a814ef6e14a6
--- tog/Makefile
+++ tog/Makefile
DEBUG = -O0 -g
.endif
CFLAGS += -Werror -Wall -Wstrict-prototypes -Wunused-variable
+#CPLAGS += -DGOT_PACK_NO_MMAP
# For now, default to installing binary in ~/bin
GROUP!=id -g -n