diff options
author | Mike Frysinger <vapier@gentoo.org> | 2009-02-20 02:31:19 -0500 |
---|---|---|
committer | Mike Frysinger <vapier@gentoo.org> | 2009-02-20 02:31:19 -0500 |
commit | 3f36f0ce46a85a7f60afb33e251782af99eec015 (patch) | |
tree | c95b22914802ab081686b8856630389c3fb84bff /libsandbox | |
parent | libsandbox: unify creat/creat64 wrappers (diff) | |
download | sandbox-3f36f0ce46a85a7f60afb33e251782af99eec015.tar.gz sandbox-3f36f0ce46a85a7f60afb33e251782af99eec015.tar.bz2 sandbox-3f36f0ce46a85a7f60afb33e251782af99eec015.zip |
libsandbox: unify openat and __wrapper_simple
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
Diffstat (limited to 'libsandbox')
-rw-r--r-- | libsandbox/wrapper-funcs/__wrapper_simple.c | 23 | ||||
-rw-r--r-- | libsandbox/wrapper-funcs/openat.c | 52 |
2 files changed, 40 insertions, 35 deletions
diff --git a/libsandbox/wrapper-funcs/__wrapper_simple.c b/libsandbox/wrapper-funcs/__wrapper_simple.c index 8aaf612..1cdf176 100644 --- a/libsandbox/wrapper-funcs/__wrapper_simple.c +++ b/libsandbox/wrapper-funcs/__wrapper_simple.c @@ -8,6 +8,12 @@ #ifndef WRAPPER_ARGS_PROTO # error WRAPPER_ARGS_PROTO needs to be defined #endif +#ifndef WRAPPER_ARGS_PROTO_FULL +# define WRAPPER_ARGS_PROTO_FULL WRAPPER_ARGS_PROTO +#endif +#ifndef WRAPPER_ARGS_FULL +# define WRAPPER_ARGS_FULL WRAPPER_ARGS +#endif #ifndef WRAPPER_RET_TYPE # define WRAPPER_RET_TYPE int #endif @@ -17,6 +23,9 @@ #ifndef WRAPPER_PRE_CHECKS # define WRAPPER_PRE_CHECKS() true #endif +#ifndef WRAPPER_SAFE_POST_EXPAND +# define WRAPPER_SAFE_POST_EXPAND +#endif extern WRAPPER_RET_TYPE EXTERN_NAME(WRAPPER_ARGS_PROTO); static WRAPPER_RET_TYPE (*WRAPPER_TRUE_NAME)(WRAPPER_ARGS_PROTO) = NULL; @@ -26,10 +35,10 @@ static WRAPPER_RET_TYPE (*WRAPPER_TRUE_NAME)(WRAPPER_ARGS_PROTO) = NULL; # define SB_HIDDEN_FUNC(x) _SB_HIDDEN_FUNC(x) #endif attribute_hidden -WRAPPER_RET_TYPE SB_HIDDEN_FUNC(WRAPPER_NAME)(WRAPPER_ARGS_PROTO) +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); + return WRAPPER_TRUE_NAME(WRAPPER_ARGS_FULL); } WRAPPER_RET_TYPE WRAPPER_NAME(WRAPPER_ARGS_PROTO) @@ -37,8 +46,14 @@ WRAPPER_RET_TYPE WRAPPER_NAME(WRAPPER_ARGS_PROTO) WRAPPER_RET_TYPE result = WRAPPER_RET_DEFAULT; if (WRAPPER_PRE_CHECKS()) - if (WRAPPER_SAFE()) - result = SB_HIDDEN_FUNC(WRAPPER_NAME)(WRAPPER_ARGS); + if (WRAPPER_SAFE()) { + WRAPPER_SAFE_POST_EXPAND + result = SB_HIDDEN_FUNC(WRAPPER_NAME)(WRAPPER_ARGS_FULL); + } return result; } + +#undef WRAPPER_ARGS_FULL +#undef WRAPPER_ARGS_PROTO_FULL +#undef WRAPPER_SAFE_POST_EXPAND diff --git a/libsandbox/wrapper-funcs/openat.c b/libsandbox/wrapper-funcs/openat.c index d8edf13..9468515 100644 --- a/libsandbox/wrapper-funcs/openat.c +++ b/libsandbox/wrapper-funcs/openat.c @@ -16,54 +16,44 @@ #else # define USE_AT 0 #endif -#define WRAPPER_RET_TYPE int -#define WRAPPER_RET_DEFAULT -1 -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); -} +#ifndef PRE_CHECK_FUNC +# define _PRE_CHECK_FUNC(x) sb_##x##_pre_check +# define PRE_CHECK_FUNC(x) _PRE_CHECK_FUNC(x) +#endif -/* Eventually, there is a third parameter: it's mode_t mode */ -WRAPPER_RET_TYPE WRAPPER_NAME(WRAPPER_ARGS_PROTO) +static inline bool PRE_CHECK_FUNC(WRAPPER_NAME)(_WRAPPER_ARGS_PROTO) { - 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 */ + /* If we're not trying to create, fail normally if + * file does not stat + */ struct stat st; #if USE_AT if (dirfd == AT_FDCWD || pathname[0] == '/') #endif #undef USE_AT if (-1 == stat(pathname, &st)) - return -1; + return false; restore_errno(); } - if (WRAPPER_SAFE()) { - 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 true; +} +#define WRAPPER_PRE_CHECKS() PRE_CHECK_FUNC(WRAPPER_NAME)(WRAPPER_ARGS) + +#define WRAPPER_SAFE_POST_EXPAND \ + int mode = 0; \ + if (flags & O_CREAT) { \ + va_list ap; \ + va_start(ap, flags); \ + mode = va_arg(ap, int); \ + va_end(ap); \ } - return result; -} +#include "__wrapper_simple.c" #undef _WRAPPER_ARGS_PROTO -#undef WRAPPER_ARGS_PROTO_FULL -#undef WRAPPER_ARGS_FULL |