Commit Diff


commit - 99b94ad7a7280ebcb23a103b28c81900bbe250ee
commit + 0e07a2a181ad1663e726597758495e6b8010ba97
blob - 8555dfbb15f6eeaf0b1eaf4aada31bf6675208b9
blob + 4fe451ef47f5e8e2b15b5050994c294162827d96
--- lib/patch.c
+++ lib/patch.c
@@ -118,6 +118,9 @@ patch_free(struct got_patch *p)
 
 	free(p->new);
 	free(p->old);
+
+	memset(p, 0, sizeof(*p));
+	STAILQ_INIT(&p->head);
 }
 
 static const struct got_error *
@@ -216,8 +219,10 @@ recv_patch(struct imsgbuf *ibuf, int *done, struct got
 		char *t;
 
 		err = got_privsep_recv_imsg(&imsg, ibuf, 0);
-		if (err)
+		if (err) {
+			patch_free(p);
 			return err;
+		}
 
 		switch (imsg.hdr.type) {
 		case GOT_IMSG_PATCH_DONE:
@@ -288,6 +293,9 @@ recv_patch(struct imsgbuf *ibuf, int *done, struct got
 	}
 
 done:
+	if (err)
+		patch_free(p);
+
 	imsg_free(&imsg);
 	return err;
 }