Correctly parse quotation and escaped spaces in FcgidWrapper command line 
argument, as currently documented.

PR: 51194



git-svn-id: https://svn.apache.org/repos/asf/httpd/mod_fcgid/trunk@1410528 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/CHANGES-FCGID b/CHANGES-FCGID
index 9e324be..6805e6c 100644
--- a/CHANGES-FCGID
+++ b/CHANGES-FCGID
@@ -1,6 +1,9 @@
                                                          -*- coding: utf-8 -*-
 Changes with mod_fcgid 2.3.8
 
+  *) Correctly parse quotation and escaped spaces in FcgidWrapper command
+     line argument, as currently documented.  PR 51194  [William Rowe]
+
   *) Honor quoted FcgidCmdOptions arguments (notably for InitialEnv
      assignments).  PR 51657  [William Rowe]
 
diff --git a/modules/fcgid/fcgid_conf.c b/modules/fcgid/fcgid_conf.c
index e2b540e..b58f686 100644
--- a/modules/fcgid/fcgid_conf.c
+++ b/modules/fcgid/fcgid_conf.c
@@ -831,11 +831,12 @@
                                const char *extension,
                                const char *virtual)
 {
-    const char *path, *tmp;
+    const char *path;
     apr_status_t rv;
     apr_finfo_t finfo;
     fcgid_cmd_conf *wrapper = NULL;
     fcgid_dir_conf *config = (fcgid_dir_conf *) dirconfig;
+    char **args;
 
     /* Sanity checks */
 
@@ -854,8 +855,9 @@
         return "Invalid wrapper file extension";
 
     /* Get wrapper path */
-    tmp = wrapper_cmdline;
-    path = ap_getword_white(cmd->temp_pool, &tmp);
+    apr_tokenize_to_argv(wrapper_cmdline, &args, cmd->temp_pool);
+    path = apr_pstrdup(cmd->pool, args[0]);
+
     if (path == NULL || *path == '\0')
         return "Invalid wrapper config";
 
diff --git a/modules/fcgid/fcgid_proc_unix.c b/modules/fcgid/fcgid_proc_unix.c
index 3d32f3a..218f3f7 100644
--- a/modules/fcgid/fcgid_proc_unix.c
+++ b/modules/fcgid/fcgid_proc_unix.c
@@ -204,23 +204,11 @@
     char **proc_environ;
     struct sockaddr_un unix_addr;
     apr_procattr_t *procattr = NULL;
-    int argc, len;
-    const char *wargv[APACHE_ARG_MAX + 1];
-    const char *word; /* For wrapper */
-    const char *tmp;
+    int len;
+    const char **wargv;
 
     /* Build wrapper args */
-    argc = 0;
-    tmp = cmdline;
-    while (1) {
-        word = ap_getword_white(procnode->proc_pool, &tmp);
-        if (word == NULL || *word == '\0')
-            break;
-        if (argc >= APACHE_ARG_MAX)
-            break;
-        wargv[argc++] = word;
-    }
-    wargv[argc] = NULL;
+    apr_tokenize_to_argv(cmdline, (char ***)&wargv, procnode->proc_pool);
 
     /*
        Create UNIX domain socket before spawn
diff --git a/modules/fcgid/fcgid_proc_win.c b/modules/fcgid/fcgid_proc_win.c
index 3c7cc29..60b26a6 100644
--- a/modules/fcgid/fcgid_proc_win.c
+++ b/modules/fcgid/fcgid_proc_win.c
@@ -69,22 +69,10 @@
     apr_file_t *file;
     const char * const *proc_environ;
     char sock_path[FCGID_PATH_MAX];
-    int argc;
-    char const * wargv[APACHE_ARG_MAX + 1], *word; /* For wrapper */
-    const char *tmp;
+    const char **wargv;
 
     /* Build wrapper args */
-    argc = 0;
-    tmp = cmdline;
-    while (1) {
-        word = ap_getword_white(procnode->proc_pool, &tmp);
-        if (word == NULL || *word == '\0')
-            break;
-        if (argc >= APACHE_ARG_MAX)
-            break;
-        wargv[argc++] = word;
-    }
-    wargv[argc] = NULL;
+    apr_tokenize_to_argv(cmdline, (char ***)&wargv, procnode->proc_pool);
 
     memset(&SecurityAttributes, 0, sizeof(SecurityAttributes));