areadlinkat: avoid failure on older glibc
authorEric Blake <ebb9@byu.net>
Thu, 22 Oct 2009 03:01:41 +0000 (21:01 -0600)
committerEric Blake <ebb9@byu.net>
Thu, 22 Oct 2009 03:31:52 +0000 (21:31 -0600)
Acting on /proc/self/-1/name gives ENOTDIR.  at-func normally falls
back to fchdir, which discovers the real problem of invalid fd and
changes to EBADF; but for areadlinkat, it mistakenly short-circuited
when FUNC_FAIL was NULL (since 0<=(char*)result is always true).

* lib/at-func.c (AT_FUNC_NAME): Check for explicit FUNC_FAIL,
rather than mis-comparing 0 against FUNC_RESULT of char*.

Signed-off-by: Eric Blake <ebb9@byu.net>
ChangeLog
lib/at-func.c

index 806c4a6..c08b844 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2009-10-21  Eric Blake  <ebb9@byu.net>
+
+       areadlinkat: avoid failure on older glibc
+       * lib/at-func.c (AT_FUNC_NAME): Check for explicit FUNC_FAIL,
+       rather than mis-comparing 0 against FUNC_RESULT of char*.
+
 2009-10-21  Bruno Haible  <bruno@clisp.org>
 
        * modules/stpncpy (License): Relicense under LGPLv2+.
index b6aa0fd..cc7bfc2 100644 (file)
@@ -84,7 +84,7 @@ AT_FUNC_NAME (int fd, char const *file AT_FUNC_POST_FILE_PARAM_DECLS)
         /* If the syscall succeeds, or if it fails with an unexpected
            errno value, then return right away.  Otherwise, fall through
            and resort to using save_cwd/restore_cwd.  */
-        if (0 <= proc_result)
+        if (FUNC_FAIL != proc_result)
           return proc_result;
         if (! EXPECTED_ERRNO (proc_errno))
           {