> 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
>