]> granicus.if.org Git - apache/commitdiff
get SSLPassPhraseDialog exec: working by passing the proper arguments
authorDoug MacEachern <dougm@apache.org>
Wed, 9 Jan 2002 19:24:32 +0000 (19:24 +0000)
committerDoug MacEachern <dougm@apache.org>
Wed, 9 Jan 2002 19:24:32 +0000 (19:24 +0000)
to apr_proc_create()
PR:
Obtained from:
Submitted by:
Reviewed by:

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@92786 13f79535-47bb-0310-9956-ffa450edef68

CHANGES
modules/ssl/mod_ssl.h
modules/ssl/ssl_engine_pphrase.c
modules/ssl/ssl_util.c

diff --git a/CHANGES b/CHANGES
index 998e63825a43cf346ddb540bed702b0fb5e0a0f6..74e892942c51dc82df6e6ff416b7bfff187b7dea 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,5 +1,7 @@
 Changes with Apache 2.0.31-dev
 
+  *) Fix SSLPassPhraseDialog exec: [Doug MacEachern]
+
 Changes with Apache 2.0.30
 
   *) Fix the main bug for FreeBSD and threaded MPM's. There are
index 699848279e430cdf450c1ce3e4ebe08fa6523277..b5e98325419a7af2c4324a91713184e92070f776 100644 (file)
@@ -743,9 +743,11 @@ char        *ssl_util_vhostid(apr_pool_t *, server_rec *);
 void         ssl_util_strupper(char *);
 void         ssl_util_uuencode(char *, const char *, BOOL);
 void         ssl_util_uuencode_binary(unsigned char *, const unsigned char *, int, BOOL);
-apr_file_t  *ssl_util_ppopen(server_rec *, apr_pool_t *, char *);
+apr_file_t  *ssl_util_ppopen(server_rec *, apr_pool_t *, const char *,
+                             const char * const *);
 void         ssl_util_ppclose(server_rec *, apr_pool_t *, apr_file_t *);
-char        *ssl_util_readfilter(server_rec *, apr_pool_t *, char *);
+char        *ssl_util_readfilter(server_rec *, apr_pool_t *, const char *,
+                                 const char * const *);
 BOOL         ssl_util_path_check(ssl_pathcheck_t, const char *, apr_pool_t *);
 ssl_algo_t   ssl_util_algotypeof(X509 *, EVP_PKEY *); 
 char        *ssl_util_algotypestr(ssl_algo_t);
index ddb693a7e5f21d7d7f9784c90aef5b5d1a00afae..5f7aa6a5309f9821211a8c4326b97273da3e3834 100644 (file)
@@ -533,18 +533,20 @@ int ssl_pphrase_Handle_CB(char *buf, int bufsize, int verify, void *srv)
      * Filter program
      */
     else if (sc->nPassPhraseDialogType == SSL_PPTYPE_FILTER) {
-        char *cmd;
+        const char *cmd = sc->szPassPhraseDialogPath;
+        const char **argv = apr_palloc(p, sizeof(char *) * 4);
         char *result;
 
         ssl_log(s, SSL_LOG_INFO,
                 "Init: Requesting pass phrase from dialog filter program (%s)",
-                sc->szPassPhraseDialogPath);
+                cmd);
 
-        if (ap_strchr_c(sc->szPassPhraseDialogPath, ' ') != NULL)
-            cmd = apr_psprintf(p, "\"%s\" %s %s", sc->szPassPhraseDialogPath, cpVHostID, cpAlgoType);
-        else
-            cmd = apr_psprintf(p, "%s %s %s", sc->szPassPhraseDialogPath, cpVHostID, cpAlgoType);
-        result = ssl_util_readfilter(s, p, cmd);
+        argv[0] = cmd;
+        argv[1] = cpVHostID;
+        argv[2] = cpAlgoType;
+        argv[3] = NULL;
+
+        result = ssl_util_readfilter(s, p, cmd, argv);
         apr_cpystrn(buf, result, bufsize);
         len = strlen(buf);
     }
index c4e137cd01b187168a9afcf1420d65947a402316..2dd65083cf3284b2c344fcc01309633764677269 100644 (file)
@@ -139,7 +139,8 @@ void ssl_util_uuencode_binary(unsigned char *szTo,
     return;
 }
 
-apr_file_t *ssl_util_ppopen(server_rec *s, apr_pool_t *p, char *cmd)
+apr_file_t *ssl_util_ppopen(server_rec *s, apr_pool_t *p, const char *cmd,
+                            const char * const *argv)
 {
     apr_procattr_t *procattr;
     apr_proc_t *proc;
@@ -156,7 +157,7 @@ apr_file_t *ssl_util_ppopen(server_rec *s, apr_pool_t *p, char *cmd)
         return NULL;
     if ((proc = (apr_proc_t *)apr_pcalloc(p, sizeof(apr_proc_t))) == NULL)
         return NULL;
-    if (apr_proc_create(proc, cmd, NULL, NULL, procattr, p) != APR_SUCCESS)
+    if (apr_proc_create(proc, cmd, argv, NULL, procattr, p) != APR_SUCCESS)
         return NULL;
     return proc->out;
 }
@@ -170,16 +171,18 @@ void ssl_util_ppclose(server_rec *s, apr_pool_t *p, apr_file_t *fp)
 /*
  * Run a filter program and read the first line of its stdout output
  */
-char *ssl_util_readfilter(server_rec *s, apr_pool_t *p, char *cmd)
+char *ssl_util_readfilter(server_rec *s, apr_pool_t *p, const char *cmd,
+                          const char * const *argv)
 {
     static char buf[MAX_STRING_LEN];
     apr_file_t *fp;
-    apr_size_t nbytes;
+    apr_size_t nbytes = 1;
     char c;
     int k;
 
-    if ((fp = ssl_util_ppopen(s, p, cmd)) == NULL)
+    if ((fp = ssl_util_ppopen(s, p, cmd, argv)) == NULL)
         return NULL;
+    /* XXX: we are reading 1 byte at a time here */
     for (k = 0; apr_file_read(fp, &c, &nbytes) == APR_SUCCESS
                 && nbytes == 1 && (k < MAX_STRING_LEN-1)     ; ) {
         if (c == '\n' || c == '\r')