]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
Fix handling of regex \ characters
authorAmos Jeffries <squid3@treenet.co.nz>
Thu, 4 Dec 2014 16:06:59 +0000 (08:06 -0800)
committerAmos Jeffries <squid3@treenet.co.nz>
Thu, 4 Dec 2014 16:06:59 +0000 (08:06 -0800)
src/ConfigParser.cc

index 3de681094527a1a694faf2788c546dc1192ce8b6..6d1b4bcc35b6ea65230fa847d046495132f59a23 100644 (file)
@@ -269,18 +269,23 @@ ConfigParser::TokenParse(const char * &nextToken, ConfigParser::TokenType &type)
             sep = w_space;
     } else if (ConfigParser::ParseQuotedOrToEol_)
         sep = "\n";
-    else if (!ConfigParser::RecognizeQuotedValues || *nextToken == '(')
-        sep = w_space;
     else if (ConfigParser::RecognizeQuotedPair_)
         sep = w_space "\\";
+    else if (!ConfigParser::RecognizeQuotedValues || *nextToken == '(')
+        sep = w_space;
     else
         sep = w_space "(";
     nextToken += strcspn(nextToken, sep);
 
-    // NP: do not permit \0 terminator to be escaped.
-    while (ConfigParser::RecognizeQuotedPair_ && *nextToken && *(nextToken-1) == '\\') {
-        ++nextToken; // skip the quoted-pair (\-escaped) character
-        nextToken += strcspn(nextToken, sep);
+    while (ConfigParser::RecognizeQuotedPair_ && *nextToken == '\\') {
+        // NP: do not permit \0 terminator to be escaped.
+        if (*(nextToken+1) && *(nextToken+1) != '\r' && *(nextToken+1) != '\n') {
+          nextToken += 2; // skip the quoted-pair (\-escaped) character
+          nextToken += strcspn(nextToken, sep);
+        } else {
+            debugs(3, DBG_CRITICAL, "FATAL: Unescaped '\' character in regex pattern: " << tokenStart);
+            self_destruct();
+        }
     }
 
     if (ConfigParser::RecognizeQuotedValues && *nextToken == '(') {