Re: [RFC PATCH 4/5] pack-objects: avoid reading uninitalized data
On Wed, 22 Oct 2008, Jeff King wrote:
Show 23 quoted lines
> In the main loop of find_deltas, we do:
>
> struct object_entry *entry = *list++;
> ...
> if (!*list_size)
> ...
> break
>
> Because we look at and increment *list _before_ the check of
> list_size, in the very last iteration of the loop we will
> look at uninitialized data, and increment the pointer beyond
> one past the end of the allocated space. Since we don't
> actually do anything with the data until after the check,
> this is not a problem in practice.
>
> But since it technically violates the C standard, and
> because it provokes a spurious valgrind warning, let's just
> move the initialization of entry to a safe place.
>
> This fixes valgrind errors in t5300, t5301, t5302, t303, and
> t9400.
>
> Signed-off-by: Jeff King <peff@peff.net>
Show 21 quoted lines
> ---
> builtin-pack-objects.c | 3 ++-
> 1 files changed, 2 insertions(+), 1 deletions(-)
>
> diff --git a/builtin-pack-objects.c b/builtin-pack-objects.c
> index 59c30d1..15b80db 100644
> --- a/builtin-pack-objects.c
> +++ b/builtin-pack-objects.c
> @@ -1375,7 +1375,7 @@ static void find_deltas(struct object_entry **list, unsigned *list_size,
> array = xcalloc(window, sizeof(struct unpacked));
>
> for (;;) {
> - struct object_entry *entry = *list++;
> + struct object_entry *entry;
> struct unpacked *n = array + idx;
> int j, max_depth, best_base = -1;
>
> @@ -1384,6 +1384,7 @@ static void find_deltas(struct object_entry **list, unsigned *list_size,
> progress_unlock();
> break;
> }---> Please preserve the empty line here so the previous code
chunk still appears logically separate.> + entry = *list++;
> (*list_size)--;
> if (!entry->preferred_base) {
> (*processed)++;