Hi,

Here a thin patch for vanilla 2.2.14 to strip comments when reading config 
files. Without
it, you can't comment inline your config nor disable a pattern for rapid
tests. In fact, this only have impact with command type AP_INIT_TAKE_ARGV like :

IndexOptions FancyIndexing VersionSort HTMLTable NameWidth=* DescriptionWidth=* 
Charset=UTF-8       # Look nicer
IndexOptions FancyIndexing VersionSort HTMLTable NameWidth=* DescriptionWidth=* 
# Charset=UTF-8     # Look nicer

Attached patch allow you to strip that as the regexp .*[^"].*(( |\t)+)#.*
to :
 - Avoid strip unblank pre-sharp character, only strip when preceding by
   space or tab

IndexIgnore .??* *~ *# Not stripped part

 - Also, handle multiline when using \

IndexOptions FancyIndexing      \       # That is stripped
                                                 VersionSort            \ # And 
that too
                                     ...

So AP_INIT_TAKE_ARGV (and others now) only see real config and no more comments.

As I can't find any "No "get string" function", I didn't do it for that way.

I think for patch is simple but hey, it's my first attempt to hack a
bit apache. I'd appreciate comments, reviews, and if it need to be applied
to "No "get string" function" part.

Bertrand

-- 
Bertrand Jacquin, EXOSEC (http://www.exosec.fr/)
ZAC des Metz - 3 Rue du petit robinson - 78350 JOUY EN JOSAS
Tel: +33 1 30 67 60 65  -  Fax: +33 1 75 43 40 70
mailto:bjacq...@exosec.fr
--- server/util.c.ori	2010-01-27 15:39:03.000000000 +0100
+++ server/util.c	2010-01-27 20:27:38.000000000 +0100
@@ -1004,6 +1004,7 @@ AP_DECLARE(int) ap_cfg_getline(char *buf
         char *src, *dst;
         char *cp;
         char *cbuf = buf;
+        char flag;
         size_t cbufsize = bufsize;
 
         while (1) {
@@ -1011,6 +1012,44 @@ AP_DECLARE(int) ap_cfg_getline(char *buf
             if (cfp->getstr(cbuf, cbufsize, cfp->param) == NULL)
                 return 1;
 
+            /* Strip comments
+             * match .*[^"].*(( |\t)+)#.*
+             */
+            for (cp = cbuf, flag = 0 ; cp < cbuf+cbufsize ; cp++) {
+                /* Don't search while in unescaped quote */
+                if (cp > cbuf && (cp[-1] != '\\' && *cp == '"')) {
+                    flag |= 0x1;
+                }
+
+                /* Ensure the quote is closed */
+                if ((flag & 0x1) % 2) {
+                    continue;
+                }
+
+                /* If a sharp is there
+                 * Ensure it's preceded with space or tab
+                 */
+                if (   *cp == '#'
+                    && (cp > cbuf ? (cp[-1] == ' ' || cp[-1] == '\t') : 1)
+                   ) {
+                    /* Erase #.* */
+                    for ( ; *cp != '\0' ; cp++) {
+                        *cp = ' ';
+                    }
+
+                    /* Back to end of config line */
+                    while (cp >= cbuf && (*cp == ' ' || *cp == '\t' || *cp == '\0')) {
+                        --cp;
+                    }
+
+                    /* Pseudo terminate it */
+                    cp[1] = '\n';
+                    cp[2] = '\0';
+    
+                    break;
+                }
+            }
+
             /*
              *  check for line continuation,
              *  i.e. match [^\\]\\[\r]\n only

Reply via email to