summaryrefslogtreecommitdiff
path: root/lib/chdir-safer.c
diff options
context:
space:
mode:
authorJim Meyering <meyering@redhat.com>2008-05-10 15:19:43 +0200
committerJim Meyering <meyering@redhat.com>2008-05-10 15:43:13 +0200
commitff0b56d949424acc0ea32b546bf8b32f98153d63 (patch)
tree1bf05d42606233b906cab2667c9efbe38abbcea1 /lib/chdir-safer.c
parent5b66f060813b0b6042c0814ec1ab06e65f775063 (diff)
downloadgnulib-ff0b56d949424acc0ea32b546bf8b32f98153d63.tar.gz
Make chdir-safer.c more efficient on a system with no symlinks.
* lib/chdir-safer.c (chdir_no_follow): Skip lstat and fstat calls also if ELOOP is zero. Suggested by Bruno Haible.
Diffstat (limited to 'lib/chdir-safer.c')
-rw-r--r--lib/chdir-safer.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/lib/chdir-safer.c b/lib/chdir-safer.c
index a5c9a4d121..03f372050f 100644
--- a/lib/chdir-safer.c
+++ b/lib/chdir-safer.c
@@ -50,8 +50,10 @@ chdir_no_follow (char const *dir)
/* If open follows symlinks, lstat DIR and fstat FD to ensure that
they are the same file; if they are different files, set errno to
ELOOP (the same value that open uses for symlinks with
- O_NOFOLLOW) so the caller can report a failure. */
- if (! HAVE_WORKING_O_NOFOLLOW)
+ O_NOFOLLOW) so the caller can report a failure.
+ Skip this check if ELOOP == 0, which should be the case
+ on any system that lacks symlink support. */
+ if (ELOOP && ! HAVE_WORKING_O_NOFOLLOW)
{
struct stat sb1;
result = lstat (dir, &sb1);