commit c52ac529dc36362fbfa98cfe20165b4008fdc440 from: Stefan Sperling date: Sat Mar 17 14:01:36 2018 UTC extract objects smaller than DELTA_RESULT_SIZE_CACHED_MAX to memory commit - a53d2f137940289a6db04a438b9b945a65ab8524 commit + c52ac529dc36362fbfa98cfe20165b4008fdc440 blob - 74ddaf8441706156d1194062a44e04ab9e7da89b blob + 53496c9e563a84d4c5e33c5a6198eaa2fd1c37e3 --- lib/pack.c +++ lib/pack.c @@ -1344,12 +1344,6 @@ got_packfile_extract_object(FILE **f, struct got_objec if ((obj->flags & GOT_OBJ_FLAG_PACKED) == 0) return got_error(GOT_ERR_OBJ_NOT_PACKED); - *f = got_opentemp(); - if (*f == NULL) { - err = got_error(GOT_ERR_FILE_OPEN); - goto done; - } - pack = get_cached_pack(obj->path_packfile, repo); if (pack == NULL) { err = cache_pack(&pack, obj->path_packfile, NULL, repo); @@ -1363,10 +1357,33 @@ got_packfile_extract_object(FILE **f, struct got_objec goto done; } + if (obj->size < GOT_DELTA_RESULT_SIZE_CACHED_MAX) + *f = fmemopen(NULL, obj->size, "w+"); + else + *f = got_opentemp(); + if (*f == NULL) { + err = got_error(GOT_ERR_FILE_OPEN); + goto done; + } err = got_inflate_to_file(&obj->size, pack->packfile, *f); - } else + } else { + uint64_t max_size; + + err = get_delta_chain_max_size(&max_size, &obj->deltas, + pack->packfile); + if (err) + return err; + if (max_size < GOT_DELTA_RESULT_SIZE_CACHED_MAX) + *f = fmemopen(NULL, max_size, "w+"); + else + *f = got_opentemp(); + if (*f == NULL) { + err = got_error(GOT_ERR_FILE_OPEN); + goto done; + } err = dump_delta_chain_to_file(&obj->size, &obj->deltas, *f, pack, repo); + } done: if (err && *f) fclose(*f);