+/*
+ * Copyright (C) 1996-2023 The Squid Software Foundation and contributors
+ *
+ * Squid software is distributed under GPLv2+ license and includes
+ * contributions from numerous individuals and organizations.
+ * Please see the COPYING and CONTRIBUTORS files for details.
+ */
+
#include "squid.h"
#include "acl/BoolOps.h"
#include "acl/Checklist.h"
-#include "Debug.h"
-#include "wordlist.h"
-
+#include "debug/Stream.h"
+#include "sbuf/SBuf.h"
/* Acl::NotNode */
Acl::NotNode::NotNode(ACL *acl)
{
assert(acl);
+ Must(strlen(acl->name) <= sizeof(name)-2);
name[0] = '!';
- strncat(&name[1], acl->name, sizeof(name)-1-1);
+ name[1] = '\0';
+ xstrncpy(&name[1], acl->name, sizeof(name)-1); // -1 for '!'
add(acl);
}
{
// Not implemented: by the time an upper level parser discovers
// an '!' operator, there is nothing left for us to parse.
- assert(false);
+ assert(false);
}
int
return "!";
}
-ACL *
-Acl::NotNode::clone() const
-{
- // Not implemented: we are not a named ACL type in squid.conf so nobody
- // should try to create a NotNode instance by ACL type name (which is
- // what clone() API is for -- it does not really clone anything).
- assert(false);
- return NULL;
-}
-
-wordlist*
+SBufList
Acl::NotNode::dump() const
{
- wordlist *text = NULL;
- wordlistAdd(&text, name);
+ SBufList text;
+ text.push_back(SBuf(name));
return text;
}
-
/* Acl::AndNode */
char const *
return "and";
}
-ACL *
-Acl::AndNode::clone() const
-{
- return new AndNode;
-}
-
int
Acl::AndNode::doMatch(ACLChecklist *checklist, Nodes::const_iterator start) const
{
Acl::AndNode::parse()
{
// Not implemented: AndNode cannot be configured directly. See Acl::AllOf.
- assert(false);
+ assert(false);
}
-
/* Acl::OrNode */
char const *
return "any-of";
}
-ACL *
-Acl::OrNode::clone() const
+bool
+Acl::OrNode::bannedAction(ACLChecklist *, Nodes::const_iterator) const
{
- return new OrNode;
+ return false;
}
int
// find the first node that matches, but stop if things go wrong
for (Nodes::const_iterator i = start; i != nodes.end(); ++i) {
+ if (bannedAction(checklist, i))
+ continue;
if (checklist->matchChild(this, i, *i)) {
lastMatch_ = i;
return 1;
// Not implemented: OrNode cannot be configured directly. See Acl::AnyOf.
assert(false);
}
+