From: Cliff Woolley Date: Wed, 29 May 2002 03:27:01 +0000 (+0000) Subject: Fix RewriteMap prg:'s that have command-line args. X-Git-Tag: 2.0.37~220 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=70d8c575a48b1d8e45aedde5fa8f4d8072302957;p=apache Fix RewriteMap prg:'s that have command-line args. PR: 8464 Submitted by: James Tait git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@95334 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/CHANGES b/CHANGES index 86efd0c86a..0f97c22f55 100644 --- a/CHANGES +++ b/CHANGES @@ -1,5 +1,8 @@ Changes with Apache 2.0.37 + *) Allow RewriteMap prg:'s to take command-line arguments. PR 8464. + [James Tait ] + *) Correctly return 413 when an invalid chunk size is given on input. Also modify ap_discard_request_body to not do anything on sub-requests or when the connection will be dropped. diff --git a/modules/mappers/mod_rewrite.c b/modules/mappers/mod_rewrite.c index 24ecf23f5f..e8f2813cec 100644 --- a/modules/mappers/mod_rewrite.c +++ b/modules/mappers/mod_rewrite.c @@ -456,7 +456,7 @@ static const char *cmd_rewritemap(cmd_parms *cmd, void *dconf, const char *a1, else if (strncmp(a2, "prg:", 4) == 0) { newmap->type = MAPTYPE_PRG; newmap->datafile = a2+4; - newmap->checkfile = a2+4; + newmap->checkfile = NULL; } else if (strncmp(a2, "int:", 4) == 0) { newmap->type = MAPTYPE_INT; @@ -481,7 +481,7 @@ static const char *cmd_rewritemap(cmd_parms *cmd, void *dconf, const char *a1, && (apr_stat(&st, newmap->checkfile, APR_FINFO_MIN, cmd->pool) != APR_SUCCESS)) { return apr_pstrcat(cmd->pool, - "RewriteMap: map file or program not found:", + "RewriteMap: map file not found:", newmap->checkfile, NULL); } @@ -3424,20 +3424,24 @@ static apr_status_t rewritemap_program_child(apr_pool_t *p, const char *progname apr_status_t rc; apr_procattr_t *procattr; apr_proc_t *procnew; + char **argv; + + rc = apr_tokenize_to_argv(progname, &argv, p); if (((rc = apr_procattr_create(&procattr, p)) != APR_SUCCESS) || ((rc = apr_procattr_io_set(procattr, APR_FULL_BLOCK, APR_FULL_NONBLOCK, APR_FULL_NONBLOCK)) != APR_SUCCESS) || ((rc = apr_procattr_dir_set(procattr, - ap_make_dirstr_parent(p, progname))) + ap_make_dirstr_parent(p, argv[0]))) != APR_SUCCESS) || ((rc = apr_procattr_cmdtype_set(procattr, APR_PROGRAM)) != APR_SUCCESS)) { /* Something bad happened, give up and go away. */ } else { procnew = apr_pcalloc(p, sizeof(*procnew)); - rc = apr_proc_create(procnew, progname, NULL, NULL, procattr, p); + rc = apr_proc_create(procnew, argv[0], (const char **)argv, NULL, + procattr, p); if (rc == APR_SUCCESS) { apr_pool_note_subprocess(p, procnew, APR_KILL_AFTER_TIMEOUT);