On Wed, 19 Nov 2014, enh wrote:
> On Tue, Nov 18, 2014 at 10:55 PM, Philip Guenther <guent...@gmail.com> wrote:
> > enh, this look as good in the perf measurement cited in that googlesource
> > link?
> 
> yes. performance seems roughly identical. thanks!

Committed, which leads to the next diff: use O_CLOEXEC on all internal 
fds, O_DIRECTORY when opening a directory other than ".", and drop the 3rd 
argument to open() as unnecessary when O_CREAT isn't used.

(I think doug@ wondered about using O_CLOEXEC before but I demurred then 
because these fds _are_ accessible to applications via members in the 
visible header file and we had lower-hanging fruit to pick then, but 
seeing that FreeBSD has done this, maybe it's safe?

(I've pinged sthen@ for a ports src scan...)

Philip Guenther


Index: gen/fts.c
===================================================================
RCS file: /cvs/src/lib/libc/gen/fts.c,v
retrieving revision 1.48
diff -u -p -r1.48 fts.c
--- gen/fts.c   20 Nov 2014 04:14:15 -0000      1.48
+++ gen/fts.c   20 Nov 2014 04:18:31 -0000
@@ -159,7 +159,8 @@ fts_open(char * const *argv, int options
         * and ".." are all fairly nasty problems.  Note, if we can't get the
         * descriptor we run anyway, just more slowly.
         */
-       if (!ISSET(FTS_NOCHDIR) && (sp->fts_rfd = open(".", O_RDONLY, 0)) < 0)
+       if (!ISSET(FTS_NOCHDIR) &&
+           (sp->fts_rfd = open(".", O_RDONLY | O_CLOEXEC)) < 0)
                SET(FTS_NOCHDIR);
 
        if (nitems == 0)
@@ -284,7 +285,8 @@ fts_read(FTS *sp)
            (p->fts_info == FTS_SL || p->fts_info == FTS_SLNONE)) {
                p->fts_info = fts_stat(sp, p, 1, -1);
                if (p->fts_info == FTS_D && !ISSET(FTS_NOCHDIR)) {
-                       if ((p->fts_symfd = open(".", O_RDONLY, 0)) < 0) {
+                       if ((p->fts_symfd =
+                           open(".", O_RDONLY | O_CLOEXEC)) < 0) {
                                p->fts_errno = errno;
                                p->fts_info = FTS_ERR;
                        } else
@@ -374,7 +376,7 @@ next:       tmp = p;
                        p->fts_info = fts_stat(sp, p, 1, -1);
                        if (p->fts_info == FTS_D && !ISSET(FTS_NOCHDIR)) {
                                if ((p->fts_symfd =
-                                   open(".", O_RDONLY, 0)) < 0) {
+                                   open(".", O_RDONLY | O_CLOEXEC)) < 0) {
                                        p->fts_errno = errno;
                                        p->fts_info = FTS_ERR;
                                } else
@@ -513,7 +515,7 @@ fts_children(FTS *sp, int instr)
            ISSET(FTS_NOCHDIR))
                return (sp->fts_child = fts_build(sp, instr));
 
-       if ((fd = open(".", O_RDONLY, 0)) < 0)
+       if ((fd = open(".", O_RDONLY | O_CLOEXEC)) < 0)
                return (NULL);
        sp->fts_child = fts_build(sp, instr);
        if (fchdir(fd)) {
@@ -1026,7 +1028,7 @@ fts_safe_changedir(FTS *sp, FTSENT *p, i
        newfd = fd;
        if (ISSET(FTS_NOCHDIR))
                return (0);
-       if (fd < 0 && (newfd = open(path, O_RDONLY, 0)) < 0)
+       if (fd < 0 && (newfd = open(path, O_RDONLY|O_DIRECTORY|O_CLOEXEC)) < 0)
                return (-1);
        if (fstat(newfd, &sb)) {
                ret = -1;

Reply via email to