version 1.1.1.1, 2012/05/29 12:26:49
|
version 1.1.1.3, 2014/06/15 16:12:55
|
Line 37
|
Line 37
|
# include <malloc.h> |
# include <malloc.h> |
#endif /* HAVE_MALLOC_H && !STDC_HEADERS */ |
#endif /* HAVE_MALLOC_H && !STDC_HEADERS */ |
#include <errno.h> |
#include <errno.h> |
#ifdef HAVE_DLOPEN |
|
# include <dlfcn.h> |
|
#else |
|
# include "compat/dlfcn.h" |
|
#endif |
|
|
|
#include "sudo.h" |
#include "sudo.h" |
#include "sudo_plugin.h" |
#include "sudo_plugin.h" |
|
#include "sudo_dso.h" |
|
|
extern char **environ; /* global environment pointer */ |
extern char **environ; /* global environment pointer */ |
static char **priv_environ; /* private environment pointer */ |
static char **priv_environ; /* private environment pointer */ |
Line 70 rpl_getenv(const char *name)
|
Line 66 rpl_getenv(const char *name)
|
typedef char * (*sudo_fn_getenv_t)(const char *); |
typedef char * (*sudo_fn_getenv_t)(const char *); |
|
|
char * |
char * |
|
getenv_unhooked(const char *name) |
|
{ |
|
sudo_fn_getenv_t fn; |
|
|
|
fn = (sudo_fn_getenv_t)sudo_dso_findsym(SUDO_DSO_NEXT, "getenv"); |
|
if (fn != NULL) |
|
return fn(name); |
|
return rpl_getenv(name); |
|
} |
|
|
|
__dso_public char *getenv(const char *); |
|
|
|
char * |
getenv(const char *name) |
getenv(const char *name) |
{ |
{ |
char *val = NULL; |
char *val = NULL; |
Line 79 getenv(const char *name)
|
Line 88 getenv(const char *name)
|
return val; |
return val; |
case SUDO_HOOK_RET_ERROR: |
case SUDO_HOOK_RET_ERROR: |
return NULL; |
return NULL; |
default: { | default: |
#if defined(HAVE_DLOPEN) && defined(RTLD_NEXT) | return getenv_unhooked(name); |
sudo_fn_getenv_t fn; | |
| |
fn = (sudo_fn_getenv_t)dlsym(RTLD_NEXT, "getenv"); | |
if (fn != NULL) | |
return fn(name); | |
#endif /* HAVE_DLOPEN && RTLD_NEXT */ | |
return rpl_getenv(name); | |
} | |
} |
} |
} |
} |
|
|
Line 136 rpl_putenv(PUTENV_CONST char *string)
|
Line 137 rpl_putenv(PUTENV_CONST char *string)
|
|
|
typedef int (*sudo_fn_putenv_t)(PUTENV_CONST char *); |
typedef int (*sudo_fn_putenv_t)(PUTENV_CONST char *); |
|
|
|
static int |
|
putenv_unhooked(PUTENV_CONST char *string) |
|
{ |
|
sudo_fn_putenv_t fn; |
|
|
|
fn = (sudo_fn_putenv_t)sudo_dso_findsym(SUDO_DSO_NEXT, "putenv"); |
|
if (fn != NULL) |
|
return fn(string); |
|
return rpl_putenv(string); |
|
} |
|
|
int |
int |
putenv(PUTENV_CONST char *string) |
putenv(PUTENV_CONST char *string) |
{ |
{ |
Line 144 putenv(PUTENV_CONST char *string)
|
Line 156 putenv(PUTENV_CONST char *string)
|
return 0; |
return 0; |
case SUDO_HOOK_RET_ERROR: |
case SUDO_HOOK_RET_ERROR: |
return -1; |
return -1; |
default: { | default: |
#if defined(HAVE_DLOPEN) && defined(RTLD_NEXT) | return putenv_unhooked(string); |
sudo_fn_putenv_t fn; | |
| |
fn = (sudo_fn_putenv_t)dlsym(RTLD_NEXT, "putenv"); | |
if (fn != NULL) | |
return fn(string); | |
#endif /* HAVE_DLOPEN && RTLD_NEXT */ | |
return rpl_putenv(string); | |
} | |
} |
} |
} |
} |
|
|
Line 201 rpl_setenv(const char *var, const char *val, int overw
|
Line 205 rpl_setenv(const char *var, const char *val, int overw
|
|
|
typedef int (*sudo_fn_setenv_t)(const char *, const char *, int); |
typedef int (*sudo_fn_setenv_t)(const char *, const char *, int); |
|
|
|
static int |
|
setenv_unhooked(const char *var, const char *val, int overwrite) |
|
{ |
|
sudo_fn_setenv_t fn; |
|
|
|
fn = (sudo_fn_setenv_t)sudo_dso_findsym(SUDO_DSO_NEXT, "setenv"); |
|
if (fn != NULL) |
|
return fn(var, val, overwrite); |
|
return rpl_setenv(var, val, overwrite); |
|
} |
|
|
int |
int |
setenv(const char *var, const char *val, int overwrite) |
setenv(const char *var, const char *val, int overwrite) |
{ |
{ |
Line 209 setenv(const char *var, const char *val, int overwrite
|
Line 224 setenv(const char *var, const char *val, int overwrite
|
return 0; |
return 0; |
case SUDO_HOOK_RET_ERROR: |
case SUDO_HOOK_RET_ERROR: |
return -1; |
return -1; |
default: { | default: |
#if defined(HAVE_SETENV) && defined(HAVE_DLOPEN) && defined(RTLD_NEXT) | return setenv_unhooked(var, val, overwrite); |
sudo_fn_setenv_t fn; | |
| |
fn = (sudo_fn_setenv_t)dlsym(RTLD_NEXT, "setenv"); | |
if (fn != NULL) | |
return fn(var, val, overwrite); | |
#endif /* HAVE_SETENV && HAVE_DLOPEN && RTLD_NEXT */ | |
return rpl_setenv(var, val, overwrite); | |
} | |
} |
} |
} |
} |
|
|
#ifdef UNSETENV_VOID | static int |
static void | |
#else | |
int | |
#endif | |
rpl_unsetenv(const char *var) |
rpl_unsetenv(const char *var) |
{ |
{ |
char **ep = environ; |
char **ep = environ; |
Line 234 rpl_unsetenv(const char *var)
|
Line 237 rpl_unsetenv(const char *var)
|
|
|
if (var == NULL || *var == '\0' || strchr(var, '=') != NULL) { |
if (var == NULL || *var == '\0' || strchr(var, '=') != NULL) { |
errno = EINVAL; |
errno = EINVAL; |
#ifdef UNSETENV_VOID |
|
return; |
|
#else |
|
return -1; |
return -1; |
#endif |
|
} |
} |
|
|
len = strlen(var); |
len = strlen(var); |
Line 253 rpl_unsetenv(const char *var)
|
Line 252 rpl_unsetenv(const char *var)
|
ep++; |
ep++; |
} |
} |
} |
} |
#ifndef UNSETENV_VOID |
|
return 0; |
return 0; |
#endif |
|
} |
} |
|
|
#ifdef UNSETENV_VOID |
#ifdef UNSETENV_VOID |
Line 264 typedef void (*sudo_fn_unsetenv_t)(const char *);
|
Line 261 typedef void (*sudo_fn_unsetenv_t)(const char *);
|
typedef int (*sudo_fn_unsetenv_t)(const char *); |
typedef int (*sudo_fn_unsetenv_t)(const char *); |
#endif |
#endif |
|
|
#ifdef UNSETENV_VOID | static int |
void | unsetenv_unhooked(const char *var) |
unsetenv(const char *var) | |
{ |
{ |
switch (process_hooks_unsetenv(var)) { | int rval = 0; |
case SUDO_HOOK_RET_STOP: | sudo_fn_unsetenv_t fn; |
return 0; | |
case SUDO_HOOK_RET_ERROR: | |
return -1; | |
default: { | |
#if defined(HAVE_UNSETENV) && defined(HAVE_DLOPEN) && defined(RTLD_NEXT) | |
sudo_fn_unsetenv_t fn; | |
|
|
fn = (sudo_fn_unsetenv_t)dlsym(RTLD_NEXT, "unsetenv"); | fn = (sudo_fn_unsetenv_t)sudo_dso_findsym(SUDO_DSO_NEXT, "unsetenv"); |
if (fn != NULL) | if (fn != NULL) { |
fn(var); | # ifdef UNSETENV_VOID |
else | fn(var); |
#endif /* HAVE_UNSETENV && HAVE_DLOPEN && RTLD_NEXT */ | # else |
rpl_unsetenv(var); | rval = fn(var); |
} | # endif |
| } else { |
| rval = rpl_unsetenv(var); |
} |
} |
|
return rval; |
} |
} |
|
|
|
#ifdef UNSETENV_VOID |
|
void |
#else |
#else |
int |
int |
|
#endif |
unsetenv(const char *var) |
unsetenv(const char *var) |
{ |
{ |
|
int rval; |
|
|
switch (process_hooks_unsetenv(var)) { |
switch (process_hooks_unsetenv(var)) { |
case SUDO_HOOK_RET_STOP: |
case SUDO_HOOK_RET_STOP: |
return 0; | rval = 0; |
| break; |
case SUDO_HOOK_RET_ERROR: |
case SUDO_HOOK_RET_ERROR: |
return -1; | rval = -1; |
default: { | break; |
#if defined(HAVE_UNSETENV) && defined(HAVE_DLOPEN) && defined(RTLD_NEXT) | default: |
sudo_fn_unsetenv_t fn; | rval = unsetenv_unhooked(var); |
| break; |
fn = (sudo_fn_unsetenv_t)dlsym(RTLD_NEXT, "unsetenv"); | |
if (fn != NULL) | |
return fn(var); | |
#endif /* HAVE_UNSETENV && HAVE_DLOPEN && RTLD_NEXT */ | |
return rpl_unsetenv(var); | |
} | |
} |
} |
|
#ifndef UNSETENV_VOID |
|
return rval; |
|
#endif |
} |
} |
#endif /* UNSETENV_VOID */ |
|