Merge branch 'rs/fsck-obj-leakfix'

Memory leak in an error codepath has been plugged.

* rs/fsck-obj-leakfix:
  fsck: free buffers on error in fsck_obj()
This commit is contained in:
Junio C Hamano 2017-08-22 10:29:13 -07:00
commit 2d68161a23

View file

@ -326,6 +326,8 @@ static void check_connectivity(void)
static int fsck_obj(struct object *obj) static int fsck_obj(struct object *obj)
{ {
int err;
if (obj->flags & SEEN) if (obj->flags & SEEN)
return 0; return 0;
obj->flags |= SEEN; obj->flags |= SEEN;
@ -336,20 +338,13 @@ static int fsck_obj(struct object *obj)
if (fsck_walk(obj, NULL, &fsck_obj_options)) if (fsck_walk(obj, NULL, &fsck_obj_options))
objerror(obj, "broken links"); objerror(obj, "broken links");
if (fsck_object(obj, NULL, 0, &fsck_obj_options)) err = fsck_object(obj, NULL, 0, &fsck_obj_options);
return -1; if (err)
goto out;
if (obj->type == OBJ_TREE) {
struct tree *item = (struct tree *) obj;
free_tree_buffer(item);
}
if (obj->type == OBJ_COMMIT) { if (obj->type == OBJ_COMMIT) {
struct commit *commit = (struct commit *) obj; struct commit *commit = (struct commit *) obj;
free_commit_buffer(commit);
if (!commit->parents && show_root) if (!commit->parents && show_root)
printf("root %s\n", describe_object(&commit->object)); printf("root %s\n", describe_object(&commit->object));
} }
@ -365,7 +360,12 @@ static int fsck_obj(struct object *obj)
} }
} }
return 0; out:
if (obj->type == OBJ_TREE)
free_tree_buffer((struct tree *)obj);
if (obj->type == OBJ_COMMIT)
free_commit_buffer((struct commit *)obj);
return err;
} }
static int fsck_obj_buffer(const struct object_id *oid, enum object_type type, static int fsck_obj_buffer(const struct object_id *oid, enum object_type type,