summaryrefslogtreecommitdiffstats
path: root/network/avahi/ipv6_race_condition_fix.patch
blob: 3418b1a11c4bf498e83109cbb6f4043e8e6e0e3c (plain)
Submitted By:            Douglas R. Reno <renodr at linuxfromscratch dot org>
Date:                    2020-10-19
Initial Package Version: 0.8
Upstream Status:         PR, not applied
Origin:                  Upstream PR (github.com/lathiat/avahi/pull/309)
Description:             Fixes a race condition when multiple NICs are in use
                         when IPv6 is enabled. This will exhibit behavior where
                         messages about withdrawing address records, registering
                         access records, and new hostname announcements are
                         spammed to the log every second.

diff -Naurp avahi-0.8.orig/avahi-core/server.c avahi-0.8/avahi-core/server.c
--- avahi-0.8.orig/avahi-core/server.c	2020-02-16 21:41:24.939967558 -0600
+++ avahi-0.8/avahi-core/server.c	2020-10-19 11:07:22.054861721 -0500
@@ -193,7 +193,7 @@ static void withdraw_rrset(AvahiServer *
         withdraw_entry(s, e);
 }
 
-static void incoming_probe(AvahiServer *s, AvahiRecord *record, AvahiInterface *i) {
+static void incoming_probe(AvahiServer *s, AvahiRecord *record, AvahiInterface *i, int from_local_iface) {
     AvahiEntry *e, *n;
     int ours = 0, won = 0, lost = 0;
 
@@ -210,7 +210,7 @@ static void incoming_probe(AvahiServer *
         if (e->dead)
             continue;
 
-        if ((cmp = avahi_record_lexicographical_compare(e->record, record)) == 0) {
+        if ((cmp = avahi_record_lexicographical_compare(e->record, record)) == 0 || from_local_iface) {
             ours = 1;
             break;
         } else {
@@ -639,7 +639,7 @@ static void handle_query_packet(AvahiSer
             if (!avahi_key_is_pattern(record->key)) {
                 if (!from_local_iface)
                     reflect_probe(s, i, record);
-                incoming_probe(s, record, i);
+                incoming_probe(s, record, i, from_local_iface);
             }
 
             avahi_record_unref(record);
@@ -961,8 +961,7 @@ static void dispatch_packet(AvahiServer
         return;
 
     /* We don't want to reflect local traffic, so we check if this packet is generated locally. */
-    if (s->config.enable_reflector)
-        from_local_iface = originates_from_local_iface(s, iface, src_address, port);
+    from_local_iface = originates_from_local_iface(s, iface, src_address, port);
 
     if (avahi_dns_packet_check_valid_multicast(p) < 0) {
         avahi_log_debug("Received invalid packet.");