ap_getword_conf() and badly quoted strings

2015-04-17 Thread Yann Ylavic
Hi,

currently ap_getword_conf() considers a word is quoted when (and only
when) it starts with a quote, regardless of this word ending (or not)
with the same quote.

That is, eg., ap_getword_conf(\) ==  or
ap_getword_conf(\whatever \\\badly\\\ quoted) == whatever
\badly\ quoted.

I wonder if it should not return the (first) word as-is in this case,
hence including the leading quote and up to the first space (ie.
restart normal parsing from the beginning of the given line):

Index: server/util.c
===
--- server/util.c(revision 1674046)
+++ server/util.c(working copy)
@@ -780,7 +780,7 @@ AP_DECLARE(char *) ap_getword_conf_nc(apr_pool_t *

 AP_DECLARE(char *) ap_getword_conf(apr_pool_t *p, const char **line)
 {
-const char *str = *line, *strend;
+const char *str = *line, *strend = NULL;
 char *res;
 char quote;

@@ -803,12 +803,16 @@ AP_DECLARE(char *) ap_getword_conf(apr_pool_t *p,
 ++strend;
 }
 }
-res = substring_conf(p, str + 1, strend - str - 1, quote);

-if (*strend == quote)
+if (*strend) {
+res = substring_conf(p, str + 1, strend - str - 1, quote);
 ++strend;
+}
+else {
+strend = NULL;
+}
 }
-else {
+if (!strend) {
 strend = str;
 while (*strend  !apr_isspace(*strend))
 ++strend;
--

With this, ap_getword_conf(\) == \ and
ap_getword_conf(\whatever \\\badly\\\ quoted) == \whatever =
\\\badly\\\ = quoted, which may raise syntax errors/typos the
administrator could be interested in.

Is that more of a fix or a compatibility issue?

Regards,
Yann.


Re: ap_getword_conf() and badly quoted strings

2015-04-17 Thread William A Rowe Jr
I think in trunk we should properly bail if the same quote char does not
occur as termination.

I don't think we should second-guess the admin's intent.




On Fri, Apr 17, 2015 at 6:43 AM, Yann Ylavic ylavic@gmail.com wrote:

 Hi,

 currently ap_getword_conf() considers a word is quoted when (and only
 when) it starts with a quote, regardless of this word ending (or not)
 with the same quote.

 That is, eg., ap_getword_conf(\) ==  or
 ap_getword_conf(\whatever \\\badly\\\ quoted) == whatever
 \badly\ quoted.

 I wonder if it should not return the (first) word as-is in this case,
 hence including the leading quote and up to the first space (ie.
 restart normal parsing from the beginning of the given line):

 Index: server/util.c
 ===
 --- server/util.c(revision 1674046)
 +++ server/util.c(working copy)
 @@ -780,7 +780,7 @@ AP_DECLARE(char *) ap_getword_conf_nc(apr_pool_t *

  AP_DECLARE(char *) ap_getword_conf(apr_pool_t *p, const char **line)
  {
 -const char *str = *line, *strend;
 +const char *str = *line, *strend = NULL;
  char *res;
  char quote;

 @@ -803,12 +803,16 @@ AP_DECLARE(char *) ap_getword_conf(apr_pool_t *p,
  ++strend;
  }
  }
 -res = substring_conf(p, str + 1, strend - str - 1, quote);

 -if (*strend == quote)
 +if (*strend) {
 +res = substring_conf(p, str + 1, strend - str - 1, quote);
  ++strend;
 +}
 +else {
 +strend = NULL;
 +}
  }
 -else {
 +if (!strend) {
  strend = str;
  while (*strend  !apr_isspace(*strend))
  ++strend;
 --

 With this, ap_getword_conf(\) == \ and
 ap_getword_conf(\whatever \\\badly\\\ quoted) == \whatever =
 \\\badly\\\ = quoted, which may raise syntax errors/typos the
 administrator could be interested in.

 Is that more of a fix or a compatibility issue?

 Regards,
 Yann.