From: Jim Meyering Date: Sat, 10 May 2008 13:19:43 +0000 (+0200) Subject: Make chdir-safer.c more efficient on a system with no symlinks. X-Git-Tag: v0.1~7416 X-Git-Url: http://erislabs.org.uk/gitweb/?a=commitdiff_plain;h=ff0b56d949424acc0ea32b546bf8b32f98153d63;p=gnulib.git 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. --- diff --git a/ChangeLog b/ChangeLog index 67653c119..4f7483a08 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,9 @@ 2008-05-10 Jim Meyering + 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. + Make chdir-safer.c slightly safer. * lib/chdir-safer.c (chdir_no_follow): Test HAVE_WORKING_O_NOFOLLOW, not O_NOFOLLOW, in case the latter is nonzero and open ignores it. diff --git a/lib/chdir-safer.c b/lib/chdir-safer.c index a5c9a4d12..03f372050 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);