unpack_loose_rest(): rewrite return handling for clarity

We have a pattern like: if (error1) ...handle error 1... else if (error2) ...handle error 2... else ...return buf... ...free buf and return NULL... This is a little subtle because it is the return in the success block that lets us skip the common error handling. Rewrite this instead to free the buffer in each error path, marking it as NULL, and then all code paths can use the common return. This should make the logic a bit easier to follow. It does mean duplicating the buf cleanup for errors, but it's a single line. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Jeff King committed Feb 25, 2025 at 01:34 UTC 1cb2f293f5a594fd5dee8400213bd2f395fbd2bf
1 file changed +6 -6
object-file.c
+6 -6
@@ -1348,16 +1348,16 @@ static void *unpack_loose_rest(git_zstream *stream,
1348 }
1349 }
1350
1351 - if (status != Z_STREAM_END)
1351 + if (status != Z_STREAM_END) {
1352 error(_("corrupt loose object '%s'"), oid_to_hex(oid));
1353 - else if (stream->avail_in)
1353 + FREE_AND_NULL(buf);
1354 + } else if (stream->avail_in) {
1355 error(_("garbage at end of loose object '%s'"),
1356 oid_to_hex(oid));
1356 - else
1357 - return buf;
1357 + FREE_AND_NULL(buf);
1358 + }
1359
1359 - free(buf);
1360 - return NULL;
1360 + return buf;
1361 }
1362
1363 /*