unpack_loose_rest(): simplify error handling

Inflating a loose object is considered successful only if we got Z_STREAM_END and there were no more bytes. We check both of those conditions and return success, but then have to check them a second time to decide which error message to produce. I.e., we do something like this: if (!error_1 && !error_2) ...return success... if (error_1) ...handle error1... else if (error_2) ...handle error2... ...common error handling... This repetition was the source of a small bug fixed in an earlier commit (our Z_STREAM_END check was not the same in the two conditionals). Instead we can chain them all into a single if/else cascade, which avoids repeating ourselves: if (error_1) ...handle error1... else if (error_2) ...handle error2.... else ...return success... ...common error handling... 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:33 UTC 547f719d9b022e87eb8cf3cb7a7632822b996e29
1 file changed +3 -3
object-file.c
+3 -3
@@ -1347,15 +1347,15 @@ static void *unpack_loose_rest(git_zstream *stream,
1347 obj_read_lock();
1348 }
1349 }
1350 - if (status == Z_STREAM_END && !stream->avail_in) {
1351 - return buf;
1352 - }
1350
1351 if (status != Z_STREAM_END)
1352 error(_("corrupt loose object '%s'"), oid_to_hex(oid));
1353 else if (stream->avail_in)
1354 error(_("garbage at end of loose object '%s'"),
1355 oid_to_hex(oid));
1356 + else
1357 + return buf;
1358 +
1359 free(buf);
1360 return NULL;
1361 }