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
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);
* 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);
}
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;
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;
}
/*
* 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')