2008-05-10 Jim Meyering <meyering@redhat.com>
+ 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.
/* 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);