From: Steven Noonan Date: Sat, 07 Nov 2009 02:22:09 GMT Subject: Re: [cgit PATCH] Close file descriptor on error in readfile() Message-ID: In-Reply-To: <4AF4D4EC.1040806@pixeltards.com> On Fri, Nov 6, 2009 at 6:01 PM, Rys Sommefeldt wrote: > Hi Lars, > > My colleagues and I use cgit at work, and we've found that the scanning > process can consume all available fds pretty quickly on our cgit hosts, > because it doesn't close them properly on error.  We have a few thousand > active repositories for cgit to scan, and we noticed it dying after a > certain amount. > > I've attached a patch which should apply against current master, although I > developed it a while back on an older 0.8 version (sorry it took so long to > subscribe and send the patch in). > > Cheers, > > Rys Sommefeldt > --- > > From 6446cf839d2104cd40848e439bf97cd7fd6ccfee Mon Sep 17 00:00:00 2001 > From: Rys Sommefeldt > Date: Fri, 6 Nov 2009 17:14:56 +0000 > Subject: [PATCH] Close fd when done > > --- > shared.c |    9 +++++++-- > 1 files changed, 7 insertions(+), 2 deletions(-) > > diff --git a/shared.c b/shared.c > index d7b2d5a..d5e54e6 100644 > --- a/shared.c > +++ b/shared.c > @@ -404,14 +404,19 @@ int readfile(const char *path, char **buf, size_t > *size) >    struct stat st; > >    fd = open(path, O_RDONLY); > -    if (fd == -1) > +    if (fd == -1) { > +        close(fd); >        return errno; > -    if (fstat(fd, &st)) > +    } The above change looks bogus. If fd == -1, you close() it anyway? > +    if (fstat(fd, &st)) { > +        close(fd); >        return errno; > +    } >    if (!S_ISREG(st.st_mode)) >        return EISDIR; >    *buf = xmalloc(st.st_size + 1); >    *size = read_in_full(fd, *buf, st.st_size); >    (*buf)[*size] = '\0'; > +    close(fd); >    return (*size == st.st_size ? 0 : errno); > } > -- > 1.6.5.2 > -- > To unsubscribe from this list: send the line "unsubscribe git" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at  http://vger.kernel.org/majordomo-info.html >