diff options
author | 2009-02-18 01:52:09 -0500 | |
---|---|---|
committer | 2009-02-18 02:31:50 -0500 | |
commit | 4141146ff8cf41a6a3ccd7a4580d0814698429e9 (patch) | |
tree | 365bcd45c669f9528ef5524038521479f1e565ab | |
parent | libsandbox: convert internal getcwd func to sb_unwrapped_foo style (diff) | |
download | sandbox-4141146ff8cf41a6a3ccd7a4580d0814698429e9.tar.gz sandbox-4141146ff8cf41a6a3ccd7a4580d0814698429e9.tar.bz2 sandbox-4141146ff8cf41a6a3ccd7a4580d0814698429e9.zip |
libsandbox: convert internal open func to sb_unwrapped_foo style
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
-rw-r--r-- | libsandbox/libsandbox.c | 2 | ||||
-rw-r--r-- | libsandbox/wrapper-funcs/open.c | 5 | ||||
-rw-r--r-- | libsandbox/wrapper-funcs/openat.c | 56 | ||||
-rw-r--r-- | libsandbox/wrappers.c | 22 | ||||
-rw-r--r-- | libsandbox/wrappers.h | 8 |
5 files changed, 45 insertions, 48 deletions
diff --git a/libsandbox/libsandbox.c b/libsandbox/libsandbox.c index 2e30c50..0cf469a 100644 --- a/libsandbox/libsandbox.c +++ b/libsandbox/libsandbox.c @@ -106,7 +106,7 @@ void libsb_init(void) mtrace(); #endif - sb_set_open(libsb_open); + sb_set_open(sb_unwrapped_open); /* Get the path and name to this library */ get_sandbox_lib(sandbox_lib); diff --git a/libsandbox/wrapper-funcs/open.c b/libsandbox/wrapper-funcs/open.c index ef649ca..fd23f31 100644 --- a/libsandbox/wrapper-funcs/open.c +++ b/libsandbox/wrapper-funcs/open.c @@ -5,7 +5,10 @@ * Licensed under the GPL-2 */ -#define WRAPPER_ARGS_PROTO const char *pathname, int flags, ... +#define _WRAPPER_ARGS_PROTO const char *pathname, int flags +#define WRAPPER_ARGS_PROTO _WRAPPER_ARGS_PROTO, ... +#define WRAPPER_ARGS_PROTO_FULL _WRAPPER_ARGS_PROTO, mode_t mode #define WRAPPER_ARGS pathname, flags +#define WRAPPER_ARGS_FULL WRAPPER_ARGS, mode #define WRAPPER_SAFE() FUNCTION_SANDBOX_SAFE_OPEN_INT(pathname, flags) #include "openat.c" diff --git a/libsandbox/wrapper-funcs/openat.c b/libsandbox/wrapper-funcs/openat.c index 3df904f..d8edf13 100644 --- a/libsandbox/wrapper-funcs/openat.c +++ b/libsandbox/wrapper-funcs/openat.c @@ -6,30 +6,37 @@ */ #ifndef WRAPPER_ARGS_PROTO /* let open() use us */ -# define WRAPPER_ARGS_PROTO int dirfd, const char *pathname, int flags, ... +# define _WRAPPER_ARGS_PROTO int dirfd, const char *pathname, int flags +# define WRAPPER_ARGS_PROTO _WRAPPER_ARGS_PROTO, ... +# define WRAPPER_ARGS_PROTO_FULL _WRAPPER_ARGS_PROTO, mode_t mode # define WRAPPER_ARGS dirfd, pathname, flags +# define WRAPPER_ARGS_FULL WRAPPER_ARGS, mode # define WRAPPER_SAFE() FUNCTION_SANDBOX_SAFE_OPEN_INT_AT(dirfd, pathname, flags) # define USE_AT 1 #else # define USE_AT 0 #endif +#define WRAPPER_RET_TYPE int +#define WRAPPER_RET_DEFAULT -1 -extern int EXTERN_NAME(WRAPPER_ARGS_PROTO); -static int (*WRAPPER_TRUE_NAME)(WRAPPER_ARGS_PROTO) = NULL; +extern WRAPPER_RET_TYPE EXTERN_NAME(WRAPPER_ARGS_PROTO); +static WRAPPER_RET_TYPE (*WRAPPER_TRUE_NAME)(WRAPPER_ARGS_PROTO) = NULL; + +attribute_hidden +WRAPPER_RET_TYPE SB_HIDDEN_FUNC(WRAPPER_NAME)(WRAPPER_ARGS_PROTO_FULL) +{ + check_dlsym(WRAPPER_TRUE_NAME, WRAPPER_SYMNAME, WRAPPER_SYMVER); + return WRAPPER_TRUE_NAME(WRAPPER_ARGS_FULL); +} /* Eventually, there is a third parameter: it's mode_t mode */ -int WRAPPER_NAME(WRAPPER_ARGS_PROTO) +WRAPPER_RET_TYPE WRAPPER_NAME(WRAPPER_ARGS_PROTO) { - va_list ap; - int mode = 0; - int result = -1; - - save_errno(); - if (flags & O_CREAT) { - va_start(ap, flags); - mode = va_arg(ap, int); - va_end(ap); - } else { + WRAPPER_RET_TYPE result = WRAPPER_RET_DEFAULT; + + if (!(flags & O_CREAT)) { + save_errno(); + /* XXX: If we're not trying to create, fail normally if * file does not stat */ struct stat st; @@ -39,17 +46,24 @@ int WRAPPER_NAME(WRAPPER_ARGS_PROTO) #undef USE_AT if (-1 == stat(pathname, &st)) return -1; + + restore_errno(); } - restore_errno(); if (WRAPPER_SAFE()) { - check_dlsym(WRAPPER_TRUE_NAME, WRAPPER_SYMNAME, - WRAPPER_SYMVER); - if (flags & O_CREAT) - result = WRAPPER_TRUE_NAME(WRAPPER_ARGS, mode); - else - result = WRAPPER_TRUE_NAME(WRAPPER_ARGS); + int mode = 0; + if (flags & O_CREAT) { + va_list ap; + va_start(ap, flags); + mode = va_arg(ap, int); + va_end(ap); + } + result = SB_HIDDEN_FUNC(WRAPPER_NAME)(WRAPPER_ARGS_FULL); } return result; } + +#undef _WRAPPER_ARGS_PROTO +#undef WRAPPER_ARGS_PROTO_FULL +#undef WRAPPER_ARGS_FULL diff --git a/libsandbox/wrappers.c b/libsandbox/wrappers.c index 172c501..511aed5 100644 --- a/libsandbox/wrappers.c +++ b/libsandbox/wrappers.c @@ -71,25 +71,3 @@ void *get_dlsym(const char *symname, const char *symver) return symaddr; } - -int libsb_open(const char *pathname, int flags, ...) -{ - va_list ap; - int mode = 0; - int result = -1; - - if (flags & O_CREAT) { - va_start(ap, flags); - mode = va_arg(ap, int); - va_end(ap); - } - - check_dlsym(true_open_DEFAULT, symname_open_DEFAULT, - symver_open_DEFAULT); - if (flags & O_CREAT) - result = true_open_DEFAULT(pathname, flags, mode); - else - result = true_open_DEFAULT(pathname, flags); - - return result; -} diff --git a/libsandbox/wrappers.h b/libsandbox/wrappers.h index 86cd16c..9524d70 100644 --- a/libsandbox/wrappers.h +++ b/libsandbox/wrappers.h @@ -14,10 +14,12 @@ void *get_dlsym(const char *, const char *); -/* Wrapper for internal use of functions in libsandbox */ -int libsb_open(const char *, int, ...); - +/* Wrapper for internal use of functions in libsandbox. Should really + * autogenerate this header ... + */ #define sb_unwrapped_getcwd sb_unwrapped_getcwd_DEFAULT attribute_hidden char *sb_unwrapped_getcwd (char *, size_t); +#define sb_unwrapped_open sb_unwrapped_open_DEFAULT +attribute_hidden int sb_unwrapped_open (const char *, int, mode_t); #endif /* __WRAPPERS_H__ */ |