From d73a4f097f96e7246718671b0a85cb94f0d3a88f Mon Sep 17 00:00:00 2001 From: Richard Jones Date: Sun, 19 Apr 2009 12:41:35 +0100 Subject: [PATCH] Implement NEED_ROOT_OR_IS_DEVICE macro. --- daemon/daemon.h | 13 +++++++++++++ daemon/file.c | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/daemon/daemon.h b/daemon/daemon.h index f18e2d4..b2b8152 100644 --- a/daemon/daemon.h +++ b/daemon/daemon.h @@ -114,6 +114,19 @@ extern void reply (xdrproc_t xdrp, char *ret); } \ } while (0) +/* Helper for functions which need either an absolute path in the + * mounted filesystem, OR a /dev/ device which exists. + */ +#define NEED_ROOT_OR_IS_DEVICE(path,errcode) \ + do { \ + if (strncmp ((path), "/dev/", 5) == 0) \ + IS_DEVICE ((path),(errcode)); \ + else { \ + NEED_ROOT ((path),(errcode)); \ + ABS_PATH ((path),(errcode)); \ + } \ + } while (0) + /* NB: * (1) You must match CHROOT_IN and CHROOT_OUT even along error paths. * (2) You must not change directory! cwd must always be "/", otherwise diff --git a/daemon/file.c b/daemon/file.c index 16dfb00..2439833 100644 --- a/daemon/file.c +++ b/daemon/file.c @@ -323,7 +323,7 @@ do_file (const char *path) int r, len, freeit = 0; char *buf; - /*NEED_ROOT (NULL); - no: we allow people to run this on /dev devices. */ + NEED_ROOT_OR_IS_DEVICE (path, NULL); ABS_PATH (path, NULL); if (strncmp (path, "/dev/", 5) == 0) -- 1.8.3.1