summaryrefslogtreecommitdiff
blob: 3c5b5dd98d9ba3b00bb582c039b5efcb1aff91c4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Bash built-in test fails to correctly report exeuctable status for non-
executable files when run by root on FreeBSD.

See http://bugs.gentoo.org/303411

Patch from Johan Hattne <johan.hattne@utsuthwestern.edu>
--- a/lib/sh/eaccess.c.orig
+++ b/lib/sh/eaccess.c
@@ -198,11 +198,19 @@
      char *path;
      int mode;
 {
+  struct stat s;
+  int ret;
+
   if (path_is_devfd (path))
     return (sh_stataccess (path, mode));
 
 #if defined (HAVE_EACCESS)		/* FreeBSD */
-  return (eaccess (path, mode));
+  if (stat (path, &s) != 0)
+    return (-1);
+  ret = eaccess (path, mode);
+  if (mode == X_OK && ret == 0 && !S_ISDIR(s.st_mode) && geteuid() == 0)
+    return ((s.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)) == 0 ? -1 : 0);
+  return (ret);
 #elif defined (EFF_ONLY_OK)		/* SVR4(?), SVR4.2 */
   return access (path, mode|EFF_ONLY_OK);
 #else