]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
Fixed Acl::CertificateData
authorFrancesco Chemolli <kinkie@squid-cache.org>
Wed, 31 Dec 2014 07:50:14 +0000 (08:50 +0100)
committerFrancesco Chemolli <kinkie@squid-cache.org>
Wed, 31 Dec 2014 07:50:14 +0000 (08:50 +0100)
src/acl/CertificateData.cc

index 377f9d71ce344df2396c340effe47fc86695c23f..9170387014b86a33aae8b647147362c8eac71ec2 100644 (file)
@@ -71,12 +71,12 @@ ACLCertificateData::match(X509 *cert)
     return values.match(value);
 }
 
-static void
-aclDumpAttributeListWalkee(char * const & node_data, void *outlist)
-{
-    /* outlist is really a SBufList * */
-    static_cast<SBufList *>(outlist)->push_back(SBuf(node_data));
-}
+struct CertificateDataAclDumpVisitor {
+    SBufList contents;
+    void operator() (char * const & node_data) {
+        contents.push_back(SBuf(node_data));
+    }
+};
 
 SBufList
 ACLCertificateData::dump() const
@@ -84,12 +84,10 @@ ACLCertificateData::dump() const
     SBufList sl;
     if (validAttributesStr)
         sl.push_back(SBuf(attribute));
-    /* damn this is VERY inefficient for long ACL lists... filling
-     * a wordlist this way costs Sum(1,N) iterations. For instance
-     * a 1000-elements list will be filled in 499500 iterations.
-     */
-    /* XXX FIXME: don't break abstraction */
-    values.values->walk(aclDumpAttributeListWalkee, &sl);
+
+    CertificateDataAclDumpVisitor visitor;
+    values.values->visit(visitor);
+    sl.splice(sl.end(),visitor.contents);
     return sl;
 }