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));