bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] fts, getcwd, glob: audit for dirfd returning -1


From: Jim Meyering
Subject: Re: [PATCH] fts, getcwd, glob: audit for dirfd returning -1
Date: Tue, 14 Sep 2010 16:36:59 +0200

Paul Eggert wrote:
> I audited fts, getcwd, and glob for the possibility of dirfd returning
> -1, and propose the following patch to fix all the problems I saw.
>
> * For fts, rewrite to avoid dirfd entirely.  This is doable now that
>   the fdopendir replacement doesn't close its argument.  The trick is
>   to never invoke opendir.
>
> * For getcwd, do not call dirfd.  A call is no longer needed now that
>   the fdopendir replacement doesn't close its argument.
>
> * For glob, add a comment explaining why dirfd can't return -1 there.
...
> diff --git a/lib/fts.c b/lib/fts.c
...
> -opendirat (int fd, char const *dir, int extra_flags)
> +opendirat (int fd, char const *dir, int extra_flags, int *pdir_fd)
>  {
>    int new_fd = openat (fd, dir,
>                         (O_RDONLY | O_DIRECTORY | O_NOCTTY | O_NONBLOCK
> @@ -307,6 +305,7 @@ opendirat (int fd, char const *dir, int extra_flags)
>        close (new_fd);
>        errno = saved_errno;
>      }
> +  *pdir_fd = new_fd;
>    return dirp;
>  }

Nice patches.  Thanks!

I would make one change: in opendirat, set *pdir_fd only
when the function returns non-NULL:

diff --git a/lib/fts.c b/lib/fts.c
index 40f1dee..de01244 100644
--- a/lib/fts.c
+++ b/lib/fts.c
@@ -305,7 +305,10 @@ opendirat (int fd, char const *dir, int extra_flags, int 
*pdir_fd)
       close (new_fd);
       errno = saved_errno;
     }
-  *pdir_fd = new_fd;
+  else
+    {
+      *pdir_fd = new_fd;
+    }
   return dirp;
 }

I don't particularly like the braces around the single-stmt
block, but since it's an else, IMHO, they're required.
Reverse the condition and put the single-stmt block first
(with no braces) if you'd prefer.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]