commit 3846622fc49b9a60aeee751320ed58ac58d38ef6 from: Mark Jamsek date: Sat Jan 07 12:17:06 2023 UTC plug leak of got_diffreg_result on output failure Move 'done' labels up so that if got_diffreg_output() fails we still call got_diffreg_result_free() instead of jumping straight over it. ok + fix from stsp@ commit - 5191b70b5b2e123aadd88aeafe2e2cfc0958c327 commit + 3846622fc49b9a60aeee751320ed58ac58d38ef6 blob - 2007e46b23e16bc18f223174ce22d2e157bad96e blob + 5e9010e76c3aa5de6de83e6b5cd54a4749c4f51a --- lib/diff.c +++ lib/diff.c @@ -72,7 +72,7 @@ diff_blobs(struct got_diff_line **lines, size_t *nline char hex2[SHA1_DIGEST_STRING_LENGTH]; const char *idstr1 = NULL, *idstr2 = NULL; off_t size1, size2; - struct got_diffreg_result *result; + struct got_diffreg_result *result = NULL; off_t outoff = 0; int n; @@ -185,14 +185,15 @@ diff_blobs(struct got_diff_line **lines, size_t *nline goto done; } +done: if (resultp && err == NULL) *resultp = result; - else { + else if (result) { free_err = got_diffreg_result_free(result); if (free_err && err == NULL) err = free_err; } -done: + return err; } @@ -276,6 +277,7 @@ diff_blob_file(struct got_diffreg_result **resultp, goto done; } +done: if (resultp && err == NULL) *resultp = result; else if (result) { @@ -283,7 +285,6 @@ diff_blob_file(struct got_diffreg_result **resultp, if (free_err && err == NULL) err = free_err; } -done: return err; }