commit a6b158cc8110b488f51e265bea16ed17a0079e0a from: Stefan Sperling date: Sun Feb 11 18:15:55 2018 UTC don't read plain objects to memory during unpack commit - 044e73932dd67a6333fb1991ab83653aeb0e2902 commit + a6b158cc8110b488f51e265bea16ed17a0079e0a blob - b00eb496bfb5c5a72716d083134d53871f9051c1 blob + 695e3dc57b3f6950442c696698ebf4591a41da82 --- lib/pack.c +++ lib/pack.c @@ -835,14 +835,33 @@ dump_delta_chain(struct got_delta_chain *deltas, FILE err = got_error_from_errno(); goto done; } + + if (n == 0) { + /* Plain object types are the delta base. */ + if (delta->type != GOT_OBJ_TYPE_COMMIT && + delta->type != GOT_OBJ_TYPE_TREE && + delta->type != GOT_OBJ_TYPE_BLOB && + delta->type != GOT_OBJ_TYPE_TAG) { + err = got_error(GOT_ERR_BAD_DELTA_CHAIN); + goto done; + } + err = got_inflate_to_file(&delta_len, delta_file, + base_file); + fclose(delta_file); + if (err) + goto done; + n++; + rewind(base_file); + continue; + } + /* Delta streams should always fit in memory. */ err = got_inflate_to_mem(&delta_buf, &delta_len, delta_file); + fclose(delta_file); if (err) - return err; + goto done; - fclose(delta_file); - err = got_delta_apply(base_file, delta_buf, delta_len, /* Final delta application writes to the output file. */ ++n < deltas->nentries ? accum_file : outfile);