commit a6d62598bfa3a98f9eea7d49ea7d809be9bdfcdf from: Mark Jamsek via: Thomas Adam date: Sat Jan 07 15:21:02 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 - 772fcad51433f2ecbfaea38a78e02d07ed1eef7f commit + a6d62598bfa3a98f9eea7d49ea7d809be9bdfcdf blob - 559955d325a27c4bce1eb5e9b3bce645b16cf7d8 blob + 00c511b5f7f9644583cf5b773e93ddb21722efea --- lib/diff.c +++ lib/diff.c @@ -73,7 +73,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; @@ -186,14 +186,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; } @@ -277,6 +278,7 @@ diff_blob_file(struct got_diffreg_result **resultp, goto done; } +done: if (resultp && err == NULL) *resultp = result; else if (result) { @@ -284,7 +286,6 @@ diff_blob_file(struct got_diffreg_result **resultp, if (free_err && err == NULL) err = free_err; } -done: return err; }