X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=avahi-core%2Fserver.c;h=876984c2e1210308365359f81a5255da21d5e528;hb=7e5c846390f76a61c6c951366e11367f741b2d0f;hp=11ab6cfde0ca69a79740e69913b1c4e5ca1991a3;hpb=3093047f1aa36bed8a37fa79004bf0ee287929f4;p=catta diff --git a/avahi-core/server.c b/avahi-core/server.c index 11ab6cf..876984c 100644 --- a/avahi-core/server.c +++ b/avahi-core/server.c @@ -1,5 +1,3 @@ -/* $Id$ */ - /*** This file is part of avahi. @@ -666,7 +664,7 @@ static void handle_response_packet(AvahiServer *s, AvahiDnsPacket *p, AvahiInter break; } - if (!avahi_key_is_pattern(record->key)) { + if (!avahi_key_is_pattern(record->key) && !avahi_record_is_link_local_address(record)) { if (handle_conflict(s, i, record, cache_flush)) { if (!from_local_iface) @@ -844,7 +842,7 @@ static int originates_from_local_legacy_unicast_socket(AvahiServer *s, const Ava if (getsockname(s->fd_legacy_unicast_ipv4, (struct sockaddr*) &lsa, &l) != 0) avahi_log_warn("getsockname(): %s", strerror(errno)); else - return lsa.sin_port == port; + return avahi_port_from_sockaddr((struct sockaddr*) &lsa) == port; } @@ -855,7 +853,7 @@ static int originates_from_local_legacy_unicast_socket(AvahiServer *s, const Ava if (getsockname(s->fd_legacy_unicast_ipv6, (struct sockaddr*) &lsa, &l) != 0) avahi_log_warn("getsockname(): %s", strerror(errno)); else - return lsa.sin6_port == port; + return avahi_port_from_sockaddr((struct sockaddr*) &lsa) == port; } return 0; @@ -900,7 +898,7 @@ static void dispatch_packet(AvahiServer *s, AvahiDnsPacket *p, const AvahiAddres if (port <= 0) { /* This fixes RHBZ #475394 */ - avahi_log_warn("Received packet from invalid source port."); + avahi_log_warn("Received packet from invalid source port %u.", (unsigned) port); return; } @@ -1009,13 +1007,6 @@ static void dispatch_legacy_unicast_packet(AvahiServer *s, AvahiDnsPacket *p) { avahi_dns_packet_set_field(p, AVAHI_DNS_FIELD_ID, slot->id); } -static void cleanup_dead(AvahiServer *s) { - assert(s); - - avahi_cleanup_dead_entries(s); - avahi_browser_cleanup(s); -} - static void mcast_socket_event(AvahiWatch *w, int fd, AvahiWatchEvent events, void *userdata) { AvahiServer *s = userdata; AvahiAddress dest, src; @@ -1044,11 +1035,11 @@ static void mcast_socket_event(AvahiWatch *w, int fd, AvahiWatchEvent events, vo if (iface != AVAHI_IF_UNSPEC) dispatch_packet(s, p, &src, port, &dest, iface, ttl); else - avahi_log_error("Incoming packet recieved on address that isn't local."); + avahi_log_error("Incoming packet received on address that isn't local."); avahi_dns_packet_free(p); - cleanup_dead(s); + avahi_cleanup_dead_entries(s); } } @@ -1071,7 +1062,7 @@ static void legacy_unicast_socket_event(AvahiWatch *w, int fd, AvahiWatchEvent e dispatch_legacy_unicast_packet(s, p); avahi_dns_packet_free(p); - cleanup_dead(s); + avahi_cleanup_dead_entries(s); } } @@ -1572,6 +1563,8 @@ AvahiServerConfig* avahi_server_config_init(AvahiServerConfig *c) { memset(c, 0, sizeof(AvahiServerConfig)); c->use_ipv6 = 1; c->use_ipv4 = 1; + c->allow_interfaces = NULL; + c->deny_interfaces = NULL; c->host_name = NULL; c->domain_name = NULL; c->check_response_ttl = 0; @@ -1601,11 +1594,13 @@ void avahi_server_config_free(AvahiServerConfig *c) { avahi_free(c->host_name); avahi_free(c->domain_name); avahi_string_list_free(c->browse_domains); + avahi_string_list_free(c->allow_interfaces); + avahi_string_list_free(c->deny_interfaces); } AvahiServerConfig* avahi_server_config_copy(AvahiServerConfig *ret, const AvahiServerConfig *c) { char *d = NULL, *h = NULL; - AvahiStringList *l = NULL; + AvahiStringList *browse = NULL, *allow = NULL, *deny = NULL; assert(ret); assert(c); @@ -1619,7 +1614,22 @@ AvahiServerConfig* avahi_server_config_copy(AvahiServerConfig *ret, const AvahiS return NULL; } - if (!(l = avahi_string_list_copy(c->browse_domains)) && c->browse_domains) { + if (!(browse = avahi_string_list_copy(c->browse_domains)) && c->browse_domains) { + avahi_free(h); + avahi_free(d); + return NULL; + } + + if (!(allow = avahi_string_list_copy(c->allow_interfaces)) && c->allow_interfaces) { + avahi_string_list_free(browse); + avahi_free(h); + avahi_free(d); + return NULL; + } + + if (!(deny = avahi_string_list_copy(c->deny_interfaces)) && c->deny_interfaces) { + avahi_string_list_free(allow); + avahi_string_list_free(browse); avahi_free(h); avahi_free(d); return NULL; @@ -1628,7 +1638,9 @@ AvahiServerConfig* avahi_server_config_copy(AvahiServerConfig *ret, const AvahiS *ret = *c; ret->host_name = h; ret->domain_name = d; - ret->browse_domains = l; + ret->browse_domains = browse; + ret->allow_interfaces = allow; + ret->deny_interfaces = deny; return ret; }