Skip to content

Commit

Permalink
Protect against updating hostname if we listen on loopback
Browse files Browse the repository at this point in the history
  • Loading branch information
zdohnal committed Mar 15, 2024
1 parent 0ac1c0d commit 2668376
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 9 deletions.
1 change: 1 addition & 0 deletions pappl/dnssd-private.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
23 changes: 15 additions & 8 deletions pappl/dnssd.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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);
Expand Down Expand Up @@ -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...
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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"))
Expand Down
2 changes: 1 addition & 1 deletion pappl/system.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down

0 comments on commit 2668376

Please sign in to comment.