dash.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] [BUILTIN] Make "test -x" sane again when run as root
@ 2011-09-26 21:16 Jonathan Nieder
  2011-09-26 22:16 ` Jonathan Nieder
  0 siblings, 1 reply; 5+ messages in thread
From: Jonathan Nieder @ 2011-09-26 21:16 UTC (permalink / raw)
  To: dash; +Cc: Christoph Egger, Petr Salinger, Herbert Xu

When dash switched from its own emulation to the true faccessat in
v0.5.7~54 (2010-04-02), on some platforms (e.g., old versions of
glibc-bsd), "test -x <path>" started returning true on all files when
run as root.  This violates POSIX.1-2008 §4.4 "File Access
Permission", which says:

	If execute permission is requested, access shall be granted
	if execute permission is granted to at least one user by the
	file permission bits or by an alternate access control
	mechanism; otherwise, access shall be denied.

Unfortunately, for historical reasons, access() and faccessat() are
allowed by POSIX to return success for X_OK when the current process
is privileged even when the above condition is not fulfilled and
actual execution would fail.  Work around this by checking the
permissions bits when mode == X_OK and geteuid() == 0.

Reported-by: Christoph Egger <christoph@debian.org>
Analysis-by: Petr Salinger <Petr.Salinger@seznam.cz>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
Thanks, all, and sorry to take so long in sending this patch out.

Thoughts?

 src/bltin/test.c |   11 +++++++++++
 1 files changed, 11 insertions(+), 0 deletions(-)

diff --git a/src/bltin/test.c b/src/bltin/test.c
index 90135e14..1093b59f 100644
--- a/src/bltin/test.c
+++ b/src/bltin/test.c
@@ -485,8 +485,19 @@ equalf (const char *f1, const char *f2)
 }
 
 #ifdef HAVE_FACCESSAT
+static int has_exec_bit_set(const char *path)
+{
+	struct stat64 st;
+
+	if (stat64(path, &st))
+		return 0;
+	return st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH);
+}
+
 static int test_file_access(const char *path, int mode)
 {
+	if (mode == X_OK && geteuid() == 0 && !has_exec_bit_set(path))
+		return 0;
 	return !faccessat(AT_FDCWD, path, mode, AT_EACCESS);
 }
 #else	/* HAVE_FACCESSAT */
-- 
1.7.7.rc1


^ permalink raw reply related	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2014-11-17 14:49 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-09-26 21:16 [PATCH] [BUILTIN] Make "test -x" sane again when run as root Jonathan Nieder
2011-09-26 22:16 ` Jonathan Nieder
2011-09-27 13:45   ` Herbert Xu
2011-09-27 23:19     ` [PATCH v2] [BUILTIN] Fix "test -x" as root on FreeBSD 8 Jonathan Nieder
2014-11-17 14:49       ` Herbert Xu

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).