Print an error before returning when pack_data is NULL ?
Otherwise, LGTM
On Fri, Aug 22, 2014 at 10:27 PM, Jeff King <peff@peff.net> wrote:
Show 69 quoted lines
> We have a global pointer pack_data pointing to the current
> pack we have open. Inside end_packfile we have two new
> pointers, old_p and new_p. The latter points to pack_data,
> and the former points to the new "installed" version of the
> packfile we get when we hand the file off to the regular
> sha1_file machinery. When then free old_p.
>
> Presumably the extra old_p pointer was there so that we
> could overwrite pack_data with new_p and still free old_p,
> but we don't do that. We just leave pack_data pointing to
> bogus memory, and don't overwrite it until we call
> start_packfile again (if ever).
>
> This can cause problems for our die routine, which calls
> end_packfile to clean things up. If we die at the wrong
> moment, we can end up looking at invalid memory in
> pack_data left after the last end_packfile().
>
> Instead, let's make sure we set pack_data to NULL after we
> free it, and make calling endfile() again with a NULL
> pack_data a noop (there is nothing to end).
>
> We can further make things less confusing by dropping old_p
> entirely, and moving new_p closer to its point of use.
>
> Signed-off-by: Jeff King <peff@peff.net>
> ---
> Noticed while running fast-import under valgrind to debug the next
> commit. :)
>
> fast-import.c | 11 +++++++----
> 1 file changed, 7 insertions(+), 4 deletions(-)
>
> diff --git a/fast-import.c b/fast-import.c
> index d73f58c..f25a4ae 100644
> --- a/fast-import.c
> +++ b/fast-import.c
> @@ -946,10 +946,12 @@ static void unkeep_all_packs(void)
>
> static void end_packfile(void)
> {
> - struct packed_git *old_p = pack_data, *new_p;
> + if (!pack_data)
> + return;
>
> clear_delta_base_cache();
> if (object_count) {
> + struct packed_git *new_p;
> unsigned char cur_pack_sha1[20];
> char *idx_name;
> int i;
> @@ -991,10 +993,11 @@ static void end_packfile(void)
> pack_id++;
> }
> else {
> - close(old_p->pack_fd);
> - unlink_or_warn(old_p->pack_name);
> + close(pack_data->pack_fd);
> + unlink_or_warn(pack_data->pack_name);
> }
> - free(old_p);
> + free(pack_data);
> + pack_data = NULL;
>
> /* We can't carry a delta across packfiles. */
> strbuf_release(&last_blob.data);
> --
> 2.1.0.346.ga0367b9
>