s3fs-popt: Add function to burn the commandline password.
authorAndreas Schneider <asn@samba.org>
Tue, 6 Nov 2012 08:27:42 +0000 (09:27 +0100)
committerJeremy Allison <jra@samba.org>
Thu, 8 Nov 2012 18:14:41 +0000 (10:14 -0800)
Signed-off-by: Andreas Schneider <asn@samba.org>
Reviewed by: Jeremy Allison <jra@samba.org>

source3/include/popt_common.h
source3/lib/popt_common.c

index 2125ed6f83afb1823685073e37ba24b1a520f549..5266f369dde8493d26e6cef7df3d895ba76d8a6b 100644 (file)
@@ -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 */
index 94e551d53b8a2fd41c6979fd1871c51ab64702e3..c07283925b82559dbf15a9e5e37416fa47fa115b 100644 (file)
@@ -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,