]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
Reject config with unknown directives before committing to it (#1897)
authorAlex Rousskov <rousskov@measurement-factory.com>
Wed, 28 Aug 2024 21:01:15 +0000 (21:01 +0000)
committerSquid Anubis <squid-anubis@squid-cache.org>
Sat, 31 Aug 2024 20:07:10 +0000 (20:07 +0000)
Ideally, we want to reject configurations with unknown directives before
applying any configuration changes that correspond to known directives,
but current apply-as-you-parse architecture makes that impractical.
Pending smooth reconfiguration refactoring will make that possible, but
we can make a step towards that ideal future now.

Rejecting bad configurations before calling configDoConfigure() reduces
the set of configuration errors that Squid can detect in one execution
(because configDoConfigure() error-checking code is not reached), but
that small reduction is a lesser evil compared to running
configDoConfigure() with a clearly broken config, especially when we are
going to kill Squid anyway. While many legacy parse_foo() functions do
apply significant changes before configDoConfigure(), we cannot easily
prevent that (for now). We can easily prevent configDoConfigure().

src/cache_cf.cc

index b66ba93cd91fb18f886bec5935c620d588ed9d8e..58f69f43f54e497a226d4940d7351cad120f1eb7 100644 (file)
@@ -625,6 +625,9 @@ Configuration::Parse()
 
     defaults_postscriptum();
 
+    if (unrecognizedDirectives)
+        throw TextException(ToSBuf("Found ", unrecognizedDirectives, " unrecognized directive(s)"), Here());
+
     /*
      * We must call configDoConfigure() before leave_suid() because
      * configDoConfigure() is where we turn username strings into
@@ -632,15 +635,6 @@ Configuration::Parse()
      */
     configDoConfigure();
 
-    // TODO: Throw before configDoConfigure(). Doing that would reduce the set
-    // of configuration errors Squid can detect in one execution, but we should
-    // not apply a clearly broken configuration, especially when we are going to
-    // quit anyway. While some legacy parse_foo() functions apply significant
-    // changes before configDoConfigure(), we cannot easily stop them. We can
-    // easily stop configDoConfigure().
-    if (unrecognizedDirectives)
-        throw TextException(ToSBuf("Found ", unrecognizedDirectives, " unrecognized directive(s)"), Here());
-
     if (opt_send_signal == -1) {
         Mgr::RegisterAction("config",
                             "Current Squid Configuration",