]> git.ipfire.org Git - thirdparty/squid.git/blobdiff - src/acl/RegexData.cc
SourceFormat Enforcement
[thirdparty/squid.git] / src / acl / RegexData.cc
index 93c829b05408f8b1d2b30be1e5afb588dd96b468..3103b3c8e0c3e22eca6d59ce0b715ceed9dcb0e9 100644 (file)
@@ -1,52 +1,32 @@
 /*
- * $Id$
+ * Copyright (C) 1996-2015 The Squid Software Foundation and contributors
  *
- * DEBUG: section 28    Access Control
- * AUTHOR: Duane Wessels
- * AUTHOR: Marcus Kool
- *
- * SQUID Web Proxy Cache          http://www.squid-cache.org/
- * ----------------------------------------------------------
- *
- *  Squid is the result of efforts by numerous individuals from
- *  the Internet community; see the CONTRIBUTORS file for full
- *  details.   Many organizations have provided support for Squid's
- *  development; see the SPONSORS file for full details.  Squid is
- *  Copyrighted (C) 2001 by the Regents of the University of
- *  California; see the COPYRIGHT file for full details.  Squid
- *  incorporates software developed and/or copyrighted by other
- *  sources; see the CREDITS file for full details.
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
- *
- *
- * Copyright (c) 2003, Robert Collins <robertc@squid-cache.org>
+ * Squid software is distributed under GPLv2+ license and includes
+ * contributions from numerous individuals and organizations.
+ * Please see the COPYING and CONTRIBUTORS files for details.
+ */
+
+/*
+ * Portions of this code are copyrighted and released under GPLv2+ by:
  * Copyright (c) 2011, Marcus Kool
+ * Please add new claims to the CONTRIBUTORS file instead.
  */
 
+/* DEBUG: section 28    Access Control */
+
 #include "squid.h"
-#include "acl/RegexData.h"
-#include "acl/Checklist.h"
 #include "acl/Acl.h"
-#include "wordlist.h"
+#include "acl/Checklist.h"
+#include "acl/RegexData.h"
 #include "ConfigParser.h"
+#include "Debug.h"
+#include "RegexList.h"
+#include "wordlist.h"
 
 static void
-aclDestroyRegexList(relist * data)
+aclDestroyRegexList(RegexList * data)
 {
-    relist *next = NULL;
+    RegexList *next = NULL;
 
     for (; data; data = next) {
         next = data->next;
@@ -69,13 +49,13 @@ ACLRegexData::match(char const *word)
 
     debugs(28, 3, "aclRegexData::match: checking '" << word << "'");
 
-    relist *first, *prev;
+    RegexList *first, *prev;
 
     first = data;
 
     prev = NULL;
 
-    relist *current = first;
+    RegexList *current = first;
 
     while (current) {
         debugs(28, 3, "aclRegexData::match: looking for '" << current->pattern << "'");
@@ -100,31 +80,31 @@ ACLRegexData::match(char const *word)
     return 0;
 }
 
-wordlist *
-ACLRegexData::dump()
+SBufList
+ACLRegexData::dump() const
 {
-    wordlist *W = NULL;
-    relist *temp = data;
+    SBufList sl;
+    RegexList *temp = data;
     int flags = REG_EXTENDED | REG_NOSUB;
 
     while (temp != NULL) {
         if (temp->flags != flags) {
             if ((temp->flags&REG_ICASE) != 0) {
-                wordlistAdd(&W, "-i");
+                sl.push_back(SBuf("-i"));
             } else {
-                wordlistAdd(&W, "+i");
+                sl.push_back(SBuf("+i"));
             }
             flags = temp->flags;
         }
 
-        wordlistAdd(&W, temp->pattern);
+        sl.push_back(SBuf(temp->pattern));
         temp = temp->next;
     }
 
-    return W;
+    return sl;
 }
 
-static char *
+static const char *
 removeUnnecessaryWildcards(char * t)
 {
     char * orig = t;
@@ -152,11 +132,11 @@ removeUnnecessaryWildcards(char * t)
     return t;
 }
 
-static relist **
-compileRE(relist **Tail, char * RE, int flags)
+static RegexList **
+compileRE(RegexList **Tail, char * RE, int flags)
 {
     int errcode;
-    relist *q;
+    RegexList *q;
     regex_t comp;
 
     if (RE == NULL  ||  *RE == '\0')
@@ -171,7 +151,7 @@ compileRE(relist **Tail, char * RE, int flags)
     }
     debugs(28, 2, "compileRE: compiled '" << RE << "' with flags " << flags );
 
-    q = (relist *) memAllocate(MEM_RELIST);
+    q = (RegexList *) memAllocate(MEM_RELIST);
     q->pattern = xstrdup(RE);
     q->regex = comp;
     q->flags = flags;
@@ -186,11 +166,11 @@ compileRE(relist **Tail, char * RE, int flags)
  * called only once per ACL.
  */
 static int
-compileOptimisedREs(relist **curlist, wordlist * wl)
+compileOptimisedREs(RegexList **curlist, wordlist * wl)
 {
-    relist **Tail;
-    relist *newlist;
-    relist **newlistp;
+    RegexList **Tail;
+    RegexList *newlist;
+    RegexList **newlistp;
     int numREs = 0;
     int flags = REG_EXTENDED | REG_NOSUB;
     int largeREindex = 0;
@@ -235,14 +215,20 @@ compileOptimisedREs(relist **curlist, wordlist * wl)
             }
         } else if (RElen + largeREindex + 3 < BUFSIZ-1) {
             debugs(28, 2, "compileOptimisedREs: adding RE '" << wl->key << "'");
-            if (largeREindex > 0)
-                largeRE[largeREindex++] = '|';
-            largeRE[largeREindex++] = '(';
-            for (char * t = wl->key; *t != '\0'; t++)
-                largeRE[largeREindex++] = *t;
-            largeRE[largeREindex++] = ')';
+            if (largeREindex > 0) {
+                largeRE[largeREindex] = '|';
+                ++largeREindex;
+            }
+            largeRE[largeREindex] = '(';
+            ++largeREindex;
+            for (char * t = wl->key; *t != '\0'; ++t) {
+                largeRE[largeREindex] = *t;
+                ++largeREindex;
+            }
+            largeRE[largeREindex] = ')';
+            ++largeREindex;
             largeRE[largeREindex] = '\0';
-            numREs++;
+            ++numREs;
         } else {
             debugs(28, 2, "compileOptimisedREs: buffer full, generating new optimised RE..." );
             newlistp = compileRE( newlistp, largeRE, flags );
@@ -282,18 +268,16 @@ compileOptimisedREs(relist **curlist, wordlist * wl)
 }
 
 static void
-compileUnoptimisedREs(relist **curlist, wordlist * wl)
+compileUnoptimisedREs(RegexList **curlist, wordlist * wl)
 {
-    relist **Tail;
-    relist **newTail;
+    RegexList **Tail;
+    RegexList **newTail;
     int flags = REG_EXTENDED | REG_NOSUB;
 
     for (Tail = curlist; *Tail != NULL; Tail = &((*Tail)->next))
         ;
 
     while (wl != NULL) {
-        int RElen;
-        RElen = strlen( wl->key );
         if (strcmp(wl->key, "-i") == 0) {
             flags |= REG_ICASE;
         } else if (strcmp(wl->key, "+i") == 0) {
@@ -310,21 +294,21 @@ compileUnoptimisedREs(relist **curlist, wordlist * wl)
 }
 
 static void
-aclParseRegexList(relist **curlist)
+aclParseRegexList(RegexList **curlist)
 {
     char *t;
     wordlist *wl = NULL;
 
     debugs(28, 2, HERE << "aclParseRegexList: new Regex line or file");
 
-    while ((t = ConfigParser::strtokFile()) != NULL) {
-        t = removeUnnecessaryWildcards(t);
-        if (strlen(t) > BUFSIZ-1) {
+    while ((t = ConfigParser::RegexStrtokFile()) != NULL) {
+        const char *clean = removeUnnecessaryWildcards(t);
+        if (strlen(clean) > BUFSIZ-1) {
             debugs(28, DBG_CRITICAL, "" << cfg_filename << " line " << config_lineno << ": " << config_input_line);
-            debugs(28, DBG_CRITICAL, "ERROR: Skipping regular expression. Larger than " << BUFSIZ-1 << " characters: '" << wl->key << "'");
+            debugs(28, DBG_CRITICAL, "ERROR: Skipping regular expression. Larger than " << BUFSIZ-1 << " characters: '" << clean << "'");
         } else {
-            debugs(28, 3, "aclParseRegexList: buffering RE '" << t << "'");
-            wordlistAdd(&wl, t);
+            debugs(28, 3, "aclParseRegexList: buffering RE '" << clean << "'");
+            wordlistAdd(&wl, clean);
         }
     }
 
@@ -355,3 +339,4 @@ ACLRegexData::clone() const
     assert (!data);
     return new ACLRegexData;
 }
+