Commit Diff


commit - ca357dd90579bd69da583a03adbb873b320e7c79
commit + 9880a1ddc7243c136989370185f03cf6bdc29051
blob - b5c27042841610fc959ed00b6037fbdb22a9237e
blob + 84db9fc5c2fd74c46922594d621a895ec6c3bfcd
--- lib/patch.c
+++ lib/patch.c
@@ -115,6 +115,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 *
@@ -213,8 +216,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:
@@ -285,6 +290,9 @@ recv_patch(struct imsgbuf *ibuf, int *done, struct got
 	}
 
 done:
+	if (err)
+		patch_free(p);
+
 	imsg_free(&imsg);
 	return err;
 }