Commit b95e21cd authored by Doug MacEachern's avatar Doug MacEachern
Browse files

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
parent 07a1a6ce
Loading
Loading
Loading
Loading
+4 −2
Changes for mod_ssl.h: 4 added lines, 2 removed lines.
Original line number Diff line number Diff line
@@ -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);
+9 −7
Changes for ssl_engine_pphrase.c: 9 added lines, 7 removed lines.
Original line number Diff line number Diff line
@@ -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);
    }
+8 −5
Changes for ssl_util.c: 8 added lines, 5 removed lines.
Original line number Diff line number Diff line
@@ -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')