--- lib/sh/eaccess.c.orig 2010-02-03 21:26:08 -0600 +++ lib/sh/eaccess.c 2010-02-03 21:56:32 -0600 @@ -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