From b95e21cdea46dd2c6c8e2084643e4b1eafe65333 Mon Sep 17 00:00:00 2001 From: Doug MacEachern Date: Wed, 9 Jan 2002 19:24:32 +0000 Subject: [PATCH] get SSLPassPhraseDialog exec: working by passing the proper arguments to apr_proc_create() PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk/modules/ssl@92786 13f79535-47bb-0310-9956-ffa450edef68 --- mod_ssl.h | 6 ++++-- ssl_engine_pphrase.c | 16 +++++++++------- ssl_util.c | 13 ++++++++----- 3 files changed, 21 insertions(+), 14 deletions(-) diff --git a/mod_ssl.h b/mod_ssl.h index 699848279e4..b5e98325419 100644 --- a/mod_ssl.h +++ b/mod_ssl.h @@ -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); diff --git a/ssl_engine_pphrase.c b/ssl_engine_pphrase.c index ddb693a7e5f..5f7aa6a5309 100644 --- a/ssl_engine_pphrase.c +++ b/ssl_engine_pphrase.c @@ -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); } diff --git a/ssl_util.c b/ssl_util.c index c4e137cd01b..2dd65083cf3 100644 --- a/ssl_util.c +++ b/ssl_util.c @@ -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') -- 2.47.2