>  static int get_object(struct ref_array_item *ref, const struct object_id 
> *oid,
> -                    int deref, struct object **obj, struct strbuf *err)
> +                   int deref, struct object **obj, struct strbuf *err)
>  {
>       int eaten;

Here the variable 'eaten' is declared, but left uninitialized.  This
was fine until now, because ...

>       int ret = 0;
>       unsigned long size;
> -     void *buf = get_obj(oid, obj, &size, &eaten);

... this line used to set it anyway.

> +     enum object_type type;
> +     void *buf = read_object_file(oid, &type, &size);
>       if (!buf)
>               ret = strbuf_addf_ret(err, -1, _("missing object %s for %s"),
>                                     oid_to_hex(oid), ref->refname);
> -     else if (!*obj)
> -             ret = strbuf_addf_ret(err, -1, _("parse_object_buffer failed on 
> %s for %s"),
> -                                   oid_to_hex(oid), ref->refname);
> -     else
> -             grab_values(ref->value, deref, *obj, buf, size);
> +     else {
> +             *obj = parse_object_buffer(oid, type, size, buf, &eaten);

However, with this change 'eaten' is only set here conditionally: if
read_object_file() doesn't return a valid object buffer, then 'eaten'
remains uninitialized.

> +             if (!*obj)
> +                     ret = strbuf_addf_ret(err, -1, _("parse_object_buffer 
> failed on %s for %s"),
> +                                           oid_to_hex(oid), ref->refname);
> +             else
> +                     grab_values(ref->value, deref, *obj, buf, size);
> +     }
>       if (!eaten)

And ultimately this condition could depend on an uninitialized value.

>               free(buf);
>       return ret;
> 
> --
> https://github.com/git/git/pull/520
> 

Reply via email to