extract blobs to tempfiles instead of reading through zlib
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
diff --git a/lib/got_lib_object.h b/lib/got_lib_object.h
index 4cfa4a5..37a0ffc 100644
--- a/lib/got_lib_object.h
+++ b/lib/got_lib_object.h
@@ -39,8 +39,6 @@ struct got_blob_object {
size_t hdrlen;
size_t blocksize;
uint8_t *read_buf;
- int flags;
-#define GOT_BLOB_F_COMPRESSED 0x01
struct got_object_id id;
};
diff --git a/lib/object.c b/lib/object.c
index 98e4f11..b422dcf 100644
--- a/lib/object.c
+++ b/lib/object.c
@@ -1031,14 +1031,14 @@ got_object_blob_open(struct got_blob_object **blob,
if (*blob == NULL)
return got_error_from_errno();
+ (*blob)->read_buf = calloc(1, blocksize);
+ if ((*blob)->read_buf == NULL) {
+ err = got_error_from_errno();
+ free(*blob);
+ *blob = NULL;
+ return err;
+ }
if (obj->flags & GOT_OBJ_FLAG_PACKED) {
- (*blob)->read_buf = calloc(1, blocksize);
- if ((*blob)->read_buf == NULL) {
- err = got_error_from_errno();
- free(*blob);
- *blob = NULL;
- return err;
- }
err = got_packfile_extract_object(&((*blob)->f), obj, repo);
if (err) {
free((*blob)->read_buf);
@@ -1048,30 +1048,43 @@ got_object_blob_open(struct got_blob_object **blob,
}
} else {
int fd;
+ FILE *f = NULL;
+ size_t size;
err = open_loose_object(&fd, obj, repo);
if (err) {
+ free((*blob)->read_buf);
free(*blob);
*blob = NULL;
return err;
}
- (*blob)->f = fdopen(fd, "rb");
+ f = fdopen(fd, "rb");
+ if (f == NULL) {
+ free((*blob)->read_buf);
+ free(*blob);
+ *blob = NULL;
+ return err;
+ }
+
+ (*blob)->f = got_opentemp();
if ((*blob)->f == NULL) {
+ err = got_error_from_errno();
+ free((*blob)->read_buf);
free(*blob);
*blob = NULL;
close(fd);
+ fclose(f);
return err;
}
- err = got_inflate_init(&(*blob)->zb, NULL, blocksize);
+ err = got_inflate_to_file(&size, f, (*blob)->f);
if (err != NULL) {
fclose((*blob)->f);
+ free((*blob)->read_buf);
free(*blob);
*blob = NULL;
+ fclose(f);
return err;
}
-
- (*blob)->read_buf = (*blob)->zb.outbuf;
- (*blob)->flags |= GOT_BLOB_F_COMPRESSED;
}
(*blob)->hdrlen = obj->hdrlen;
@@ -1084,10 +1097,7 @@ got_object_blob_open(struct got_blob_object **blob,
void
got_object_blob_close(struct got_blob_object *blob)
{
- if (blob->flags & GOT_BLOB_F_COMPRESSED)
- got_inflate_end(&blob->zb);
- else
- free(blob->read_buf);
+ free(blob->read_buf);
fclose(blob->f);
free(blob);
}
@@ -1115,9 +1125,6 @@ got_object_blob_read_block(size_t *outlenp, struct got_blob_object *blob)
{
size_t n;
- if (blob->flags & GOT_BLOB_F_COMPRESSED)
- return got_inflate_read(&blob->zb, blob->f, outlenp);
-
n = fread(blob->read_buf, 1, blob->blocksize, blob->f);
if (n == 0 && ferror(blob->f))
return got_ferror(blob->f, GOT_ERR_IO);