From 266837699c5b8d002fc86d802d3c75070ef625a2 Mon Sep 17 00:00:00 2001 From: Zdenek Dohnal Date: Fri, 15 Mar 2024 10:21:05 +0100 Subject: [PATCH] Protect against updating hostname if we listen on loopback --- pappl/dnssd-private.h | 1 + pappl/dnssd.c | 23 +++++++++++++++-------- pappl/system.c | 2 +- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/pappl/dnssd-private.h b/pappl/dnssd-private.h index ed69fa98..3e6da236 100644 --- a/pappl/dnssd-private.h +++ b/pappl/dnssd-private.h @@ -52,6 +52,7 @@ typedef void *_pappl_dns_sd_t; // DNS-SD master reference extern const char *_papplDNSSDCopyHostName(char *buffer, size_t bufsize) _PAPPL_PRIVATE; extern int _papplDNSSDGetHostChanges(void) _PAPPL_PRIVATE; extern _pappl_dns_sd_t _papplDNSSDInit(pappl_system_t *system) _PAPPL_PRIVATE; +extern bool _papplDNSSDIsLoopback(const char *name) _PAPPL_PRIVATE; extern void _papplDNSSDLock(void) _PAPPL_PRIVATE; extern const char *_papplDNSSDStrError(int error) _PAPPL_PRIVATE; extern void _papplDNSSDUnlock(void) _PAPPL_PRIVATE; diff --git a/pappl/dnssd.c b/pappl/dnssd.c index b9f04b86..eb0d7ee7 100644 --- a/pappl/dnssd.c +++ b/pappl/dnssd.c @@ -26,8 +26,13 @@ static char pappl_dns_sd_hostname[256] = ""; // Current DNS-SD hostname +#ifdef HAVE_MDNSRESPONDER static int pappl_dns_sd_hostname_changes = 0; // Number of host name changes/collisions +#elif defined(HAVE_AVAHI) +static int pappl_dns_sd_hostname_changes = -1; + // Number of host name changes/collisions +#endif // HAVE_MDNSRESPONDER static pthread_mutex_t pappl_dns_sd_hostname_mutex = PTHREAD_MUTEX_INITIALIZER; // Host name mutex #ifdef HAVE_MDNSRESPONDER @@ -49,7 +54,6 @@ static AvahiThreadedPoll *pappl_dns_sd_poll = NULL; // static void dns_sd_geo_to_loc(const char *geo, unsigned char loc[16]); -static bool dns_sd_is_loopback(const char *name); #ifdef HAVE_MDNSRESPONDER static void DNSSD_API dns_sd_hostname_callback(DNSServiceRef ref, DNSServiceFlags flags, uint32_t if_index, DNSServiceErrorType error, const char *fullname, uint16_t rrtype, uint16_t rrclass, uint16_t rdlen, const void *rdata, uint32_t ttl, void *context); static void DNSSD_API dns_sd_printer_callback(DNSServiceRef sdRef, DNSServiceFlags flags, DNSServiceErrorType errorCode, const char *name, const char *regtype, const char *domain, pappl_printer_t *printer); @@ -393,9 +397,9 @@ _papplPrinterRegisterDNSSDNoLock( papplLogPrinter(printer, PAPPL_LOGLEVEL_DEBUG, "Registering DNS-SD name '%s' on '%s'", printer->dns_sd_name, printer->system->hostname); # ifdef HAVE_MDNSRESPONDER - if_index = dns_sd_is_loopback(system->hostname) ? kDNSServiceInterfaceIndexLocalOnly : kDNSServiceInterfaceIndexAny; + if_index = _papplDNSSDIsLoopback(system->hostname) ? kDNSServiceInterfaceIndexLocalOnly : kDNSServiceInterfaceIndexAny; # else - if_index = dns_sd_is_loopback(system->hostname) ? if_nametoindex("lo") : AVAHI_IF_UNSPEC; + if_index = _papplDNSSDIsLoopback(system->hostname) ? if_nametoindex("lo") : AVAHI_IF_UNSPEC; # endif // HAVE_MDNSRESPONDER // Get attributes and values for the TXT record... @@ -952,9 +956,9 @@ _papplSystemRegisterDNSSDNoLock( papplLog(system, PAPPL_LOGLEVEL_DEBUG, "Registering DNS-SD name '%s' on '%s'", system->dns_sd_name, system->hostname); # ifdef HAVE_MDNSRESPONDER - if_index = dns_sd_is_loopback(system->hostname) ? kDNSServiceInterfaceIndexLocalOnly : kDNSServiceInterfaceIndexAny; + if_index = _papplDNSSDIsLoopback(system->hostname) ? kDNSServiceInterfaceIndexLocalOnly : kDNSServiceInterfaceIndexAny; # else - if_index = dns_sd_is_loopback(system->hostname) ? if_nametoindex("lo") : AVAHI_IF_UNSPEC; + if_index = _papplDNSSDIsLoopback(system->hostname) ? if_nametoindex("lo") : AVAHI_IF_UNSPEC; # endif // HAVE_MDNSRESPONDER if (system->geo_location) @@ -1479,13 +1483,16 @@ dns_sd_system_callback( // -// 'dns_sd_is_loopback()' - Find out whether the string means +// '_papplDNSSDIsLoopback()' - Find out whether the string means // localhost // -static bool -dns_sd_is_loopback(const char *name) +bool +_papplDNSSDIsLoopback(const char *name) { + if (!name) + return (false); + if (!strcasecmp(name, "localhost")) return (true); else if (!strcmp(name, "127.0.0.1")) diff --git a/pappl/system.c b/pappl/system.c index 5517c084..56e38e61 100644 --- a/pappl/system.c +++ b/pappl/system.c @@ -652,7 +652,7 @@ papplSystemRun(pappl_system_t *system) // I - System bool force_dns_sd = system->dns_sd_host_changes != dns_sd_host_changes; // Force re-registration? - if (force_dns_sd) + if (!_papplDNSSDIsLoopback(system->hostname) && force_dns_sd) _papplSystemSetHostNameNoLock(system, NULL); if (system->dns_sd_collision || force_dns_sd)