]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
Destroy ACLs in the reverse order of creation to avoid destruction segfaults
authorAlex Rousskov <rousskov@measurement-factory.com>
Mon, 2 Dec 2013 00:35:50 +0000 (17:35 -0700)
committerAlex Rousskov <rousskov@measurement-factory.com>
Mon, 2 Dec 2013 00:35:50 +0000 (17:35 -0700)
during reconfiguration.

Group ACLs created later may use other ACLs created earlier. A group ACL must
be deleted first so that its AclDeleter can safely access registration status
(and avoid double deletion) of the ACLs it uses. Since ACLs are remembered (in
Config.aclList) using a singly-linked list, it is difficult to change their
deletion order.  Instead, we change their listing order from FIFO to LIFO.

src/acl/Acl.cc

index c690b8b330a382f5695f24e016914e6cda718a6a..ebe87390f3599f12cb1e01ee5713bdc91da20595 100644 (file)
@@ -295,13 +295,11 @@ ACL::ParseAclLine(ConfigParser &parser, ACL ** head)
                A->cfgline);
     }
 
-    /* append */
+    // prepend so that ACLs declared later (and possibly using earlier ACLs)
+    // are destroyed earlier (before the ACLs they use are destroyed)
     assert(head && *head == Config.aclList);
     A->registered = true;
-
-    while (*head)
-        head = &(*head)->next;
-
+    A->next = *head;
     *head = A;
 }