From: Jim Meyering Date: Wed, 27 Jun 2007 13:02:21 GMT Subject: [PATCH] git-log: detect dup and fdopen failure Message-ID: <87r6nxo8iq.fsf_-_@rho.meyering.net> In-Reply-To: <81b0412b0706270548p6f694fd6x5f47cbefa16c08ac@mail.gmail.com> "Alex Riesen" wrote: > On 6/27/07, Jim Meyering wrote: >> Without this, if you ever run out of file descriptors, dup will >> fail (silently), fdopen will return NULL, and fprintf will >> try to dereference NULL (i.e., usually segfault). > > But if you check the result of fdopen for NULL instead > you'll cover the dup failure _and_ out-of-memory in one > go. You'll loose the errno (probably), but you don't seem > to use it here anyway. Good catch. Thanks! I didn't see that fdopen could fail with ENOMEM. That'll teach me to trust the man page. I see POSIX does mention it. Here's a better patch: Signed-off-by: Jim Meyering --- builtin-log.c | 8 ++++++-- 1 files changed, 6 insertions(+), 2 deletions(-) diff --git a/builtin-log.c b/builtin-log.c index 073a2a1..7b0d6f4 100644 --- a/builtin-log.c +++ b/builtin-log.c @@ -588,8 +588,12 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix) if (ignore_if_in_upstream) get_patch_ids(&rev, &ids, prefix); - if (!use_stdout) - realstdout = fdopen(dup(1), "w"); + if (!use_stdout) { + int fd = dup(1); + if (fd < 0 || (realstdout = fdopen(fd, "w")) == NULL) + die("failed to duplicate standard output: %s", + strerror(errno)); + } prepare_revision_walk(&rev); while ((commit = get_revision(&rev)) != NULL) {