X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=lib%2Fchdir-safer.c;h=a6f77b0afc8c3e5b772248a7126a44a1805605cc;hb=4e765f32d65fe20b118366c8cab7bde74a916652;hp=f7d657c60f7db9c50474cf1dd618b027de4152dc;hpb=57fdfd3f8ec62b105c53bcdf6f127c35c7fe7391;p=gnulib.git diff --git a/lib/chdir-safer.c b/lib/chdir-safer.c index f7d657c60..a6f77b0af 100644 --- a/lib/chdir-safer.c +++ b/lib/chdir-safer.c @@ -1,6 +1,6 @@ /* much like chdir(2), but safer - Copyright (C) 2005, 2006 Free Software Foundation, Inc. + Copyright (C) 2005-2006, 2008-2009 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -29,6 +29,10 @@ #include #include "same-inode.h" +#ifndef HAVE_READLINK +# define HAVE_READLINK 0 +#endif + /* Like chdir, but fail if DIR is a symbolic link to a directory (or similar funny business), or if DIR is not readable. This avoids a minor race condition between when a directory is created or statted @@ -46,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 (! O_NOFOLLOW) + O_NOFOLLOW) so the caller can report a failure. + Skip this check if HAVE_READLINK == 0, which should be the case + on any system that lacks symlink support. */ + if (HAVE_READLINK && ! HAVE_WORKING_O_NOFOLLOW) { struct stat sb1; result = lstat (dir, &sb1);