diff options
author | Andreas Schneider <asn@samba.org> | 2012-11-06 09:27:42 +0100 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 2012-11-08 10:14:41 -0800 |
commit | c51abb35dfff86cb503d36a844184f7a95f29cdb (patch) | |
tree | 9ec9b2d4a7970bde31471af3115f32b9eaba11b8 | |
parent | d236709d15ba577def07f049c975069eb39ba1e3 (diff) | |
download | samba-c51abb35dfff86cb503d36a844184f7a95f29cdb.tar.gz samba-c51abb35dfff86cb503d36a844184f7a95f29cdb.tar.bz2 samba-c51abb35dfff86cb503d36a844184f7a95f29cdb.zip |
s3fs-popt: Add function to burn the commandline password.
Signed-off-by: Andreas Schneider <asn@samba.org>
Reviewed by: Jeremy Allison <jra@samba.org>
-rw-r--r-- | source3/include/popt_common.h | 1 | ||||
-rw-r--r-- | source3/lib/popt_common.c | 47 |
2 files changed, 48 insertions, 0 deletions
diff --git a/source3/include/popt_common.h b/source3/include/popt_common.h index 2125ed6f83..5266f369dd 100644 --- a/source3/include/popt_common.h +++ b/source3/include/popt_common.h @@ -49,5 +49,6 @@ extern const struct poptOption popt_common_dynconfig[]; #define POPT_COMMON_OPTION { NULL, 0, POPT_ARG_INCLUDE_TABLE, popt_common_option, 0, "Common samba commandline config:", NULL }, void popt_common_set_auth_info(struct user_auth_info *auth_info); +void popt_burn_cmdline_password(int argc, char *argv[]); #endif /* _POPT_COMMON_H */ diff --git a/source3/lib/popt_common.c b/source3/lib/popt_common.c index 94e551d53b..c07283925b 100644 --- a/source3/lib/popt_common.c +++ b/source3/lib/popt_common.c @@ -605,6 +605,53 @@ void popt_common_set_auth_info(struct user_auth_info *auth_info) global_auth_info = auth_info; } +/** + * @brief Burn the commandline password. + * + * This function removes the password from the command line so we + * don't leak the password e.g. in 'ps aux'. + * + * It should be called after processing the options and you should pass down + * argv from main(). + * + * @param[in] argc The number of arguments. + * + * @param[in] argv[] The argument array we will find the array. + */ +void popt_burn_cmdline_password(int argc, char *argv[]) +{ + bool found = false; + char *p = NULL; + int i, ulen = 0; + + for (i = 0; i < argc; i++) { + p = argv[i]; + if (strncmp(p, "-U", 2) == 0) { + ulen = 2; + found = true; + } else if (strncmp(p, "--user", 6) == 0) { + ulen = 6; + found = true; + } + + if (found) { + if (p == NULL) { + return; + } + + if (strlen(p) == ulen) { + continue; + } + + p = strchr_m(p, '%'); + if (p != NULL) { + memset(p, '\0', strlen(p)); + } + found = false; + } + } +} + struct poptOption popt_common_credentials[] = { { NULL, 0, POPT_ARG_CALLBACK|POPT_CBFLAG_PRE, (void *)popt_common_credentials_callback, 0, |