]> git.ipfire.org Git - thirdparty/git.git/commitdiff
test-delta: close output descriptor after use
authorJeff King <peff@peff.net>
Thu, 24 Jul 2025 00:03:08 +0000 (20:03 -0400)
committerJunio C Hamano <gitster@pobox.com>
Thu, 24 Jul 2025 18:28:10 +0000 (11:28 -0700)
After we write to the output file, the program exits. This naturally
closes the descriptor. But we should do an explicit close for two
reasons:

  1. It's possible to hit an error on close(), which we should detect
     and report via our exit code.

  2. Leaking descriptors is a bad practice in general. Even if it isn't
     meaningful here, it sets a bad example.

It is tempting to write:

  if (write_in_full(fd, ...) < 0 || close(fd) < 0)
        die_errno(...);

But that pattern contains a subtle problem that has resulted in
descriptor leaks before. If write_in_full() fails, we'll short-circuit
and never call close(), leaking the descriptor.

That's not a problem here, since our error path dies instead of
returning up the stack. But since we're trying to set a good example,
let's write it out as two separate conditions. As a bonus, that lets us
produce a slightly more specific error message.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
t/helper/test-delta.c

index 7945793078c4c79410bf063a1b56a4fd1c119bcd..52ea00c93718c7699a550832e56f9299621d49b2 100644 (file)
@@ -45,6 +45,8 @@ int cmd__delta(int argc, const char **argv)
        fd = xopen(argv[4], O_WRONLY|O_CREAT|O_TRUNC, 0666);
        if (write_in_full(fd, out_buf, out_size) < 0)
                die_errno("write(%s)", argv[4]);
+       if (close(fd) < 0)
+               die_errno("close(%s)", argv[4]);
 
        strbuf_release(&from);
        strbuf_release(&data);