From: Todd C. Miller Date: Fri, 19 Mar 2010 11:52:31 +0000 (-0400) Subject: Rewrite compat/getprogname.c and add setprogname(). X-Git-Tag: SUDO_1_8_0~786 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=eec5235d199de71bbdc2458fbaa193b4095e0fae;p=sudo Rewrite compat/getprogname.c and add setprogname(). The progname is now passed to the plugin via the settings array. --- diff --git a/compat/getprogname.c b/compat/getprogname.c index ec3b964bc..96c2615d2 100644 --- a/compat/getprogname.c +++ b/compat/getprogname.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003-2005 Todd C. Miller + * Copyright (c) 2010 Todd C. Miller * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -12,10 +12,6 @@ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * Sponsored in part by the Defense Advanced Research Projects - * Agency (DARPA) and Air Force Research Laboratory, Air Force - * Materiel Command, USAF, under agreement number F39502-99-1-0512. */ #include @@ -24,24 +20,24 @@ #include #include -const char * -getprogname(void) +static char *progname = "sudo"; + +void +setprogname(const char *name) { -#ifdef PIC - return("sudo"); -#else - static const char *progname; - extern int Argc; - extern char **Argv; + const char *base; - if (progname == NULL) { - if (Argc < 0) - progname = "sudo"; - else if ((progname = strrchr(Argv[0], '/')) != NULL) - progname++; - else - progname = Argv[0]; + if ((base = strrchr(name, '/')) != NULL) { + base++; + } else { + base = name; } - return(progname); -#endif + if (strcmp(progname, base) != 0) + progname = base; +} + +const char * +getprogname(void) +{ + return progname; } diff --git a/include/compat.h b/include/compat.h index 1d00fa6e1..f622dbd0c 100644 --- a/include/compat.h +++ b/include/compat.h @@ -248,6 +248,7 @@ extern const char *__progname; # define getprogname() (__progname) # else const char *getprogname(void); +void setprogname(const char *); #endif /* HAVE___PROGNAME */ #endif /* !HAVE_GETPROGNAME */ diff --git a/plugins/sample/sample_plugin.c b/plugins/sample/sample_plugin.c index 33ef42891..f60214b14 100644 --- a/plugins/sample/sample_plugin.c +++ b/plugins/sample/sample_plugin.c @@ -163,6 +163,11 @@ policy_open(unsigned int version, sudo_conv_t conversation, if (strncmp(*ui, "runas_group=", sizeof("runas_group=") - 1) == 0) { runas_group = *ui + sizeof("runas_group=") - 1; } +#if !defined(HAVE_GETPROGNAME) && !defined(HAVE___PROGNAME) + if (strncmp(*ui, "progname=", sizeof("progname=") - 1) == 0) { + setprogname(*ui + sizeof("progname=") - 1); + } +#endif } if (runas_user != NULL) { if ((pw = getpwnam(runas_user)) == NULL) { diff --git a/plugins/sudoers/sudoers.c b/plugins/sudoers/sudoers.c index 986cef6cd..469c5f1ff 100644 --- a/plugins/sudoers/sudoers.c +++ b/plugins/sudoers/sudoers.c @@ -162,8 +162,6 @@ static int NewArgc; static char **NewArgv; /* XXX */ -extern int Argc; -extern char **Argv; extern char **environ; /* error.c */ @@ -1228,6 +1226,12 @@ deserialize_info(char * const settings[], char * const user_info[]) continue; } #endif /* HAVE_BSD_AUTH_H */ +#if !defined(HAVE_GETPROGNAME) && !defined(HAVE___PROGNAME) + if (MATCHES(*cur, "progname=")) { + setprogname(*cur + sizeof("progname=") - 1); + continue; + } +#endif } for (cur = user_info; *cur != NULL; cur++) { diff --git a/src/parse_args.c b/src/parse_args.c index e970a9f04..222a19057 100644 --- a/src/parse_args.c +++ b/src/parse_args.c @@ -100,7 +100,9 @@ static struct sudo_settings { { "selinux_type" }, #define ARG_RUNAS_USER 11 { "runas_user" }, -#define NUM_SETTINGS 12 +#define ARG_PROGNAME 12 + { "progname" }, +#define NUM_SETTINGS 13 { NULL } }; @@ -125,6 +127,9 @@ parse_args(int argc, char **argv, int *nargc, char ***nargv, char ***settingsp, env_add = emalloc2(env_size, sizeof(char *)); env_add[0] = NULL; + /* Pass progname to plugin so it can call setprogname() */ + sudo_settings[ARG_PROGNAME].value = getprogname(); + /* First, check to see if we were invoked as "sudoedit". */ if (strcmp(getprogname(), "sudoedit") == 0) mode = MODE_EDIT; diff --git a/src/sudo.c b/src/sudo.c index 86b0eac2d..a595b0aaa 100644 --- a/src/sudo.c +++ b/src/sudo.c @@ -99,10 +99,6 @@ static int run_command(struct command_details *details, char *argv[], /* XXX - header file */ extern const char *list_user, *runas_user, *runas_group; -/* Used by getprogname() unless crt0 supports getting program name. */ -int Argc; -char **Argv; - /* Needed by tgetpass when executing askpass helper */ struct user_details user_details; @@ -126,13 +122,15 @@ main(int argc, char *argv[], char *envp[]) malloc_options = "AFGJPR"; #endif - Argc = argc; - Argv = argv; - #ifdef HAVE_SETLOCALE setlocale(LC_ALL, ""); #endif +#if !defined(HAVE_GETPROGNAME) && !defined(HAVE___PROGNAME) + if (argc > 0) + setprogname(argv[0]); +#endif + if (geteuid() != 0) errorx(1, "must be setuid root"); @@ -159,7 +157,7 @@ main(int argc, char *argv[], char *envp[]) user_info = get_user_info(&user_details); /* Parse command line arguments. */ - sudo_mode = parse_args(Argc, Argv, &nargc, &nargv, &settings, &env_add); + sudo_mode = parse_args(argc, argv, &nargc, &nargv, &settings, &env_add); /* Read sudo.conf and load plugins. */ sudo_load_plugins(_PATH_SUDO_CONF, &policy_plugin, &io_plugins);