]> git.ipfire.org Git - thirdparty/cups.git/commitdiff
Update locking for Avahi.
authorMichael R Sweet <msweet@msweet.org>
Tue, 23 Sep 2025 22:24:35 +0000 (18:24 -0400)
committerMichael R Sweet <msweet@msweet.org>
Tue, 23 Sep 2025 22:24:35 +0000 (18:24 -0400)
cups/dnssd.c

index a269ab81d468cdd2579258dd0f2a822ead96031d..8a2509c8965d98d9ad1b4ab8f6c1144a2a8ad389 100644 (file)
@@ -220,11 +220,13 @@ static void               avahi_browse_cb(AvahiServiceBrowser *browser, AvahiIfIndex if_index
 static void            avahi_client_cb(AvahiClient *c, AvahiClientState state, cups_dnssd_t *dnssd);
 static void            avahi_domain_cb(AvahiDomainBrowser *b, AvahiIfIndex interface, AvahiProtocol protocol, AvahiBrowserEvent event, const char *domain, AvahiLookupResultFlags flags, cups_dnssd_t *dnssd);
 static AvahiIfIndex    avahi_if_index(uint32_t if_index);
+static void            avahi_lock(cups_dnssd_t *dnssd, const char *name);
 static void            *avahi_monitor(cups_dnssd_t *dnssd);
 static int             avahi_poll_cb(struct pollfd *ufds, unsigned int nfds, int timeout, cups_dnssd_t *dnssd);
 static void            avahi_query_cb(AvahiRecordBrowser *browser, AvahiIfIndex if_index, AvahiProtocol protocol, AvahiBrowserEvent event, const char *fullName, uint16_t rrclass, uint16_t rrtype, const void *rdata, size_t rdlen, AvahiLookupResultFlags flags, cups_dnssd_query_t *query);
 static void            avahi_resolve_cb(AvahiServiceResolver *resolver, AvahiIfIndex if_index, AvahiProtocol protocol, AvahiResolverEvent event, const char *name, const char *type, const char *domain, const char *host_name, const AvahiAddress *address, uint16_t port, AvahiStringList *txtrec, AvahiLookupResultFlags flags, cups_dnssd_resolve_t *resolve);
 static void            avahi_service_cb(AvahiEntryGroup *srv, AvahiEntryGroupState state, cups_dnssd_service_t *service);
+static void            avahi_unlock(cups_dnssd_t *dnssd, const char *name);
 #endif // HAVE_MDNSRESPONDER
 
 
@@ -480,11 +482,7 @@ cupsDNSSDBrowseNew(
   if (count == 1)
     count ++;
 
-  if (!dnssd->in_callback)
-  {
-    DEBUG_puts("2cupsDNSSDBrowseNew: Locking mutex.");
-    cupsMutexLock(&dnssd->mutex);
-  }
+  avahi_lock(dnssd, "cupsDNSSDBrowseNew");
 
   for (i = 1; i < count && browse->num_browsers < _CUPS_DNSSD_MAX; i ++)
   {
@@ -512,13 +510,7 @@ cupsDNSSDBrowseNew(
 
       cupsArrayDelete(tarray);
 
-      if (!dnssd->in_callback)
-      {
-       DEBUG_puts("2cupsDNSSDBrowseNew: Unlocking mutex.");
-       cupsMutexUnlock(&dnssd->mutex);
-      }
-
-      goto done;
+      goto avahi_done;
     }
 
     if (!domain && dnssd->num_domains > 0)
@@ -534,13 +526,9 @@ cupsDNSSDBrowseNew(
 
   cupsArrayDelete(tarray);
 
-  if (!dnssd->in_callback)
-  {
-    DEBUG_puts("2cupsDNSSDBrowseNew: Unlocking mutex.");
-    cupsMutexUnlock(&dnssd->mutex);
+  avahi_done:
 
-    avahi_simple_poll_wakeup(dnssd->poll);
-  }
+  avahi_unlock(dnssd, "cupsDNSSDBrowseNew");
 #endif // HAVE_MDNSRESPONDER
 
   DEBUG_printf("2cupsDNSSDBrowseNew: Adding browse=%p", (void *)browse);
@@ -1066,21 +1054,11 @@ cupsDNSSDQueryNew(
   }
 
 #else // HAVE_AVAHI
-  if (!dnssd->in_callback)
-  {
-    DEBUG_puts("4avahi_poll_cb: Locking mutex.");
-    cupsMutexLock(&dnssd->mutex);
-  }
+  avahi_lock(dnssd, "cupsDNSSDQueryNew");
 
   query->browser = avahi_record_browser_new(dnssd->client, avahi_if_index(if_index), AVAHI_PROTO_UNSPEC, fullname, AVAHI_DNS_CLASS_IN, rrtype, 0, (AvahiRecordBrowserCallback)avahi_query_cb, query);
 
-  if (!dnssd->in_callback)
-  {
-    DEBUG_puts("4avahi_poll_cb: Unlocking mutex.");
-    cupsMutexUnlock(&dnssd->mutex);
-
-    avahi_simple_poll_wakeup(dnssd->poll);
-  }
+  avahi_unlock(dnssd, "cupsDNSSDQueryNew");
 
   if (!query->browser)
   {
@@ -1232,21 +1210,11 @@ cupsDNSSDResolveNew(
   }
 
 #else // HAVE_AVAHI
-  if (!dnssd->in_callback)
-  {
-    DEBUG_puts("2cupsDNSSDResolveNew: Locking mutex.");
-    cupsMutexLock(&dnssd->mutex);
-  }
+  avahi_lock(dnssd, "cupsDNSSDResolveNew");
 
   resolve->resolver = avahi_service_resolver_new(dnssd->client, avahi_if_index(if_index), AVAHI_PROTO_UNSPEC, name, type, domain, AVAHI_PROTO_UNSPEC, /*flags*/0, (AvahiServiceResolverCallback)avahi_resolve_cb, resolve);
 
-  if (!dnssd->in_callback)
-  {
-    DEBUG_puts("2cupsDNSSDResolveNew: Unlocking mutex.");
-    cupsMutexUnlock(&dnssd->mutex);
-
-    avahi_simple_poll_wakeup(dnssd->poll);
-  }
+  avahi_unlock(dnssd, "cupsDNSSDResolveNew");
 
   if (!resolve->resolver)
   {
@@ -1619,7 +1587,11 @@ cupsDNSSDServiceAdd(
     *subtypes++ = '\0';
 
   // Add the service entry...
-  if ((error = avahi_entry_group_add_service_strlst(service->group, avahi_if_index(service->if_index), AVAHI_PROTO_UNSPEC, /*flags*/0, service->name, regtype, domain, host, port, txtrec)) < 0)
+  avahi_lock(service->dnssd, "cupsDNSSDServiceAdd");
+
+  error = avahi_entry_group_add_service_strlst(service->group, avahi_if_index(service->if_index), AVAHI_PROTO_UNSPEC, /*flags*/0, service->name, regtype, domain, host, port, txtrec);
+
+  if (error < 0)
   {
     report_error(service->dnssd, "Unable to register '%s.%s': %s", service->name, regtype, avahi_strerror(error));
     ret = false;
@@ -1649,6 +1621,8 @@ cupsDNSSDServiceAdd(
     }
   }
 
+  avahi_unlock(service->dnssd, "cupsDNSSDServiceAdd");
+
   free(regtype);
 
   if (txtrec)
@@ -1756,8 +1730,12 @@ cupsDNSSDServiceNew(
 #ifdef HAVE_MDNSRESPONDER
 #elif _WIN32
 #else // HAVE_AVAHI
+  avahi_lock(dnssd, "cupsDNSSDServiceNew");
+
   service->group = avahi_entry_group_new(dnssd->client, (AvahiEntryGroupCallback)avahi_service_cb, service);
 
+  avahi_unlock(dnssd, "cupsDNSSDServiceNew");
+
   if (!service->group)
   {
     report_error(dnssd, "Unable to create DNS-SD service registration: %s", avahi_strerror(avahi_client_errno(dnssd->client)));
@@ -1820,8 +1798,11 @@ cupsDNSSDServicePublish(
 #elif defined(HAVE_MDNSRESPONDER)
   (void)service;
 #else // HAVE_AVAHI
+  avahi_lock(service->dnssd, "cupsDNSSDServicePublish);
+
   avahi_entry_group_commit(service->group);
-  avahi_simple_poll_wakeup(service->dnssd->poll);
+
+  avahi_unlock(service->dnssd, "cupsDNSSDServicePublish");
 #endif // _WIN32
 
   DEBUG_printf("2cupsDNSSDServicePublish: Returning %s.", ret ? "true" : "false");
@@ -1926,7 +1907,13 @@ cupsDNSSDServiceSetLocation(
   // Add LOC record now...
   int error;                           // Error code
 
-  if ((error = avahi_entry_group_add_record(service->group, avahi_if_index(service->if_index), AVAHI_PROTO_UNSPEC, /*flags*/0, service->name, AVAHI_DNS_CLASS_IN, AVAHI_DNS_TYPE_LOC, /*ttl*/75 * 60, service->loc, sizeof(service->loc))) < 0)
+  avahi_lock(service->dnssd, "cupsDNSSDServiceSetLocation");
+
+  error = avahi_entry_group_add_record(service->group, avahi_if_index(service->if_index), AVAHI_PROTO_UNSPEC, /*flags*/0, service->name, AVAHI_DNS_CLASS_IN, AVAHI_DNS_TYPE_LOC, /*ttl*/75 * 60, service->loc, sizeof(service->loc));
+
+  avahi_unlock(service->dnssd, "cupsDNSSDServiceSetLocation");
+
+  if (error < 0)
   {
     report_error(service->dnssd, "Unable to register LOC record for '%s': %s", service->name, avahi_strerror(error));
     ret = false;
@@ -1957,8 +1944,12 @@ delete_browse(
 #else // HAVE_AVAHI
   size_t       i;                      // Looping var
 
+  avahi_lock(browse->dnssd, "delete_browse");
+
   for (i = 0; i < browse->num_browsers; i ++)
     avahi_service_browser_free(browse->browsers[i]);
+
+  avahi_unlock(browse->dnssd, "delete_browse");
 #endif // HAVE_MDNSRESPONDER
 
   free(browse);
@@ -1980,7 +1971,11 @@ delete_query(
   DnsStopMulticastQuery(&query->handle);
 
 #else // HAVE_AVAHI
+  avahi_lock(query->dnssd, "delete_query");
+
   avahi_record_browser_free(query->browser);
+
+  avahi_unlock(query->dnssd, "delete_query");
 #endif // HAVE_MDNSRESPONDER
 }
 
@@ -2000,7 +1995,11 @@ delete_resolve(
   DnsServiceResolveCancel(&resolve->cancel);
 
 #else // HAVE_AVAHI
+  avahi_lock(resolve->dnssd, "delete_resolve");
+
   avahi_service_resolver_free(resolve->resolver);
+
+  avahi_unlock(resolve->dnssd, "delete_resolve");
 #endif // HAVE_MDNSRESPONDER
 
 }
@@ -2033,7 +2032,11 @@ delete_service(
   }
 
 #else // HAVE_AVAHI
+  avahi_lock(service->dnssd, "delete_service");
+
   avahi_entry_group_free(service->group);
+
+  avahi_unlock(service->dnssd, "delete_service");
 #endif // HAVE_MDNSRESPONDER
 
   free(service);
@@ -2900,6 +2903,24 @@ avahi_if_index(uint32_t if_index)        // I - DNS-SD interface index
 }
 
 
+//
+// 'avahi_lock()' - Lock the access mutex.
+//
+
+static void
+avahi_lock(cups_dnssd_t *dnssd,                // I - DNS-SD context
+           const char   *name)         // I - Who is locking?
+{
+  (void)name;
+
+  if (!dnssd->in_callback)
+  {
+    DEBUG_printf("2avahi_lock: Locking mutex for %s.", name);
+    cupsMutexLock(&dnssd->mutex);
+  }
+}
+
+
 //
 // 'avahi_monitor()' - Background thread for Avahi.
 //
@@ -3081,4 +3102,24 @@ avahi_service_cb(
 
   (service->cb)(service, service->cb_data, state == AVAHI_ENTRY_GROUP_COLLISION ? CUPS_DNSSD_FLAGS_COLLISION : CUPS_DNSSD_FLAGS_NONE);
 }
+
+
+//
+// 'avahi_unlock()' - Unlock the access mutex.
+//
+
+static void
+avahi_unlock(cups_dnssd_t *dnssd,      // I - DNS-SD context
+             const char   *name)       // I - Who is unlocking?
+{
+  (void)name;
+
+  if (!dnssd->in_callback)
+  {
+    DEBUG_printf("2avahi_unlock: Unlocking mutex for %s.", name);
+    cupsMutexUnlock(&dnssd->mutex);
+
+    avahi_simple_poll_wakeup(dnssd->poll);
+  }
+}
 #endif // HAVE_MDNSRESPONDER