On Sun, Dec 29, 2013 at 09:51:28AM -0800, patrick keshishian wrote: > Hi, > > Accidentally deleted this message from my inbox. This is > a "reconstruction" from mailing list archive. > > Suggestion/comment below. > > Earlier today: > > Hi All, > > > > From NetBSD: > > Fix file descriptor leak. Found by cppcheck. > > > > Index: src/libexec/ld.so/ldconfig/ldconfig.c > > =================================================================== > > RCS file: /cvs/src/libexec/ld.so/ldconfig/ldconfig.c,v > > retrieving revision 1.31 > > diff -u -p -r1.31 ldconfig.c > > --- src/libexec/ld.so/ldconfig/ldconfig.c 13 Nov 2013 05:41:42 -0000 > > 1.31 > > +++ src/libexec/ld.so/ldconfig/ldconfig.c 29 Dec 2013 11:53:38 -0000 > > @@ -416,16 +416,16 @@ buildhints(void) > > if (write(fd, &hdr, sizeof(struct hints_header)) != > > sizeof(struct hints_header)) { > > warn("%s", _PATH_LD_HINTS); > > - goto out; > > + goto fdout; > > } > > if (write(fd, blist, hdr.hh_nbucket * sizeof(struct hints_bucket)) != > > hdr.hh_nbucket * sizeof(struct hints_bucket)) { > > warn("%s", _PATH_LD_HINTS); > > - goto out; > > + goto fdout; > > } > > if (write(fd, strtab, strtab_sz) != strtab_sz) { > > warn("%s", _PATH_LD_HINTS); > > - goto out; > > + goto fdout; > > } > > if (close(fd) != 0) { > > warn("%s", _PATH_LD_HINTS); > > @@ -438,6 +438,8 @@ buildhints(void) > > } > > > > ret = 0; > > +fdout: > > + (void)close(fd); > > out: > > free(blist); > > free(strtab); > > > > Why not a simpler diff where the the close() call is moved > after 'out:' label instead of introducing a new label and > an additional close() call?
That's equally possible. I adapted the diff from the NetBSD fix, which uses the additional label. I guess that it will boil down to the ldconfig maintainer to decide which way is better :-) > > Like such: > (disclaimer: not tested, not even compiled.) > > Index: ldconfig.c > =================================================================== > RCS file: /cvs/obsd/src/libexec/ld.so/ldconfig/ldconfig.c,v > retrieving revision 1.31 > diff -u -p -u -p -r1.31 ldconfig.c > --- ldconfig.c 13 Nov 2013 05:41:42 -0000 1.31 > +++ ldconfig.c 29 Dec 2013 15:31:58 -0000 > @@ -322,7 +322,7 @@ hinthash(char *cp, int vmajor, int vmino > int > buildhints(void) > { > - int strtab_sz = 0, nhints = 0, fd, i, ret = -1, str_index = 0; > + int strtab_sz = 0, nhints = 0, fd = -1, i, ret = -1, str_index = 0; > struct hints_bucket *blist; > struct hints_header hdr; > struct shlib_list *shp; > @@ -427,10 +427,6 @@ buildhints(void) > warn("%s", _PATH_LD_HINTS); > goto out; > } > - if (close(fd) != 0) { > - warn("%s", _PATH_LD_HINTS); > - goto out; > - } > > if (rename(tmpfilenam, _PATH_LD_HINTS) != 0) { > warn("%s", _PATH_LD_HINTS); > @@ -439,6 +435,8 @@ buildhints(void) > > ret = 0; > out: > + if (-1 != fd && close(fd) != 0) > + warn("%s", _PATH_LD_HINTS); > free(blist); > free(strtab); > return (ret);