commit ab3ad429d13810549bc4338c59fe5e8a0168e228 from: Stefan Sperling date: Mon Jul 23 08:34:33 2018 UTC fix leaks in resolve_offset_delta() commit - 063c1beddf228ca8de0908dfc24c5a045de41ab3 commit + ab3ad429d13810549bc4338c59fe5e8a0168e228 blob - eaca8311fc195b30910f37ca7d19b7bfe34ffc13 blob + 4ad316f3338e6906c54c7dfc2aeb43250fc05ee3 --- lib/pack.c +++ lib/pack.c @@ -954,19 +954,25 @@ resolve_offset_delta(struct got_delta_chain *deltas, err = add_delta(deltas, pack->path_packfile, delta_offset, tslen, delta_type, delta_size, delta_data_offset, delta_buf, delta_len); if (err) - return err; + goto done; /* An offset delta must be in the same packfile. */ - if (base_offset >= pack->filesize) - return got_error(GOT_ERR_PACK_OFFSET); + if (base_offset >= pack->filesize) { + err = got_error(GOT_ERR_PACK_OFFSET); + goto done; + } err = parse_object_type_and_size(&base_type, &base_size, &base_tslen, pack, base_offset); if (err) - return err; + goto done; - return resolve_delta_chain(deltas, repo, packidx, pack, base_offset, + err = resolve_delta_chain(deltas, repo, packidx, pack, base_offset, base_tslen, base_type, base_size, recursion - 1); +done: + if (err) + free(delta_buf); + return err; } static const struct got_error *