Hello everyone,

I have received error report RHEL-16398 [1], which I think makes sense to fix even in the lastest version. I believe it allows non-intentional another instance running without error. What is worse, it does not even show any warning that initialization is incomplete.

Of course the problem at start is those errors happen in time when no log is available. I think that can be fixed easily by using stderr at that time. That is patch #1.

Second makes EADDRNOTAVAIL bind errors still hidden, but prints all other errors at least to stderr. On a system with systemd that should make it present in journalctl -u dnsmasq anyway. EADDRINUSE is made fatal, because that would not be usually handled by new addresses added later. If there is a need to start another dnsmasq instance without TCP listeners, I think that should be specified more explicitly. Makes EADDRINUSE fatal the same way as with --bind-interfaces.

Would you find any other errors, which should be hidden or made fatal? What would you think of those changes?

1. https://issues.redhat.com/browse/RHEL-16398

--
Petr Menšík
Software Engineer, RHEL
Red Hat, http://www.redhat.com/
PGP: DFCF908DB7C87E8E529925BC4931CA5B6C9FC5CB
From 207e9f4241c79b703320ae3568208e3a47cd25ef Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Petr=20Men=C5=A1=C3=ADk?= <pemen...@redhat.com>
Date: Wed, 22 Nov 2023 20:04:14 +0100
Subject: [PATCH 2/2] Prevent starting another instance with --bind-dynamic

Previously startup bind() errors were silently dropped when starting with
--bind-dynamic. Make even in that mode EADDRINUSE error fatal to prevent
running another instance with half-initialized listeners.

On the other hand still hide address not available error, which is very
likely the reason for using bind-dynamic. Expect the address specified
will just appear later.
---
 src/network.c | 19 +++++++++++--------
 1 file changed, 11 insertions(+), 8 deletions(-)

diff --git a/src/network.c b/src/network.c
index ca9fada..f18be24 100644
--- a/src/network.c
+++ b/src/network.c
@@ -921,13 +921,9 @@ static int make_sock(union mysockaddr *addr, int type, int dienow)
       errno = errsave;
 
       if (dienow)
-	{
-	  /* failure to bind addresses given by --listen-address at this point
-	     is OK if we're doing bind-dynamic */
-	  if (!option_bool(OPT_CLEVERBIND))
-	    die(s, daemon->addrbuff, EC_BADNET);
-	}
-      else
+	die(s, daemon->addrbuff, EC_BADNET);
+      else if (!option_bool(OPT_CLEVERBIND)
+	       || (option_bool(OPT_CLEVERBIND) && errno != EADDRNOTAVAIL))
 	my_syslog(LOG_WARNING, s, daemon->addrbuff, strerror(errno));
       
       return -1;
@@ -940,7 +936,14 @@ static int make_sock(union mysockaddr *addr, int type, int dienow)
     goto err;
   
   if ((rc = bind(fd, (struct sockaddr *)addr, sa_len(addr))) == -1)
-    goto err;
+    {
+      if (dienow && option_bool(OPT_CLEVERBIND) && errno != EADDRINUSE)
+	  /* failure to bind addresses given by --listen-address at this point
+	     is OK if we're doing bind-dynamic, except EADDRINUSE */
+	dienow = 0;
+
+      goto err;
+    }
   
   if (type == SOCK_STREAM)
     {
-- 
2.42.0

From c1982e364c01a00c8b6454b677ae0dbe1ea4a382 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Petr=20Men=C5=A1=C3=ADk?= <pemen...@redhat.com>
Date: Wed, 22 Nov 2023 20:00:01 +0100
Subject: [PATCH 1/2] Make stderr logging enabled until normal logging starts

Some kinds of errors like socket bind errors are done before dnsmasq
starts regular logging facility. Do not have those messages disappear,
but log them to stderr. As soon as log_start is called, that is resetted
according to configuration settings.
---
 src/log.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/log.c b/src/log.c
index 77032fb..6edcc09 100644
--- a/src/log.c
+++ b/src/log.c
@@ -35,7 +35,7 @@
 /* defaults in case we die() before we log_start() */
 static int log_fac = LOG_DAEMON;
 static int log_stderr = 0;
-static int echo_stderr = 0;
+static int echo_stderr = 1;
 static int log_fd = -1;
 static int log_to_file = 0;
 static int entries_alloced = 0;
-- 
2.42.0

_______________________________________________
Dnsmasq-discuss mailing list
Dnsmasq-discuss@lists.thekelleys.org.uk
https://lists.thekelleys.org.uk/cgi-bin/mailman/listinfo/dnsmasq-discuss

Reply via email to