From: Wouter Wijngaards Date: Fri, 23 Apr 2010 06:48:49 +0000 (+0000) Subject: - Squelch log message: sendto failed permission denied for X-Git-Tag: release-1.4.5rc1~51 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=109fbe235041fc74d98c0e30b563cbf70e8e32a8;p=thirdparty%2Funbound.git - Squelch log message: sendto failed permission denied for 255.255.255.255, it is visible in VERB_DETAIL (verbosity 2). git-svn-id: file:///svn/unbound/trunk@2088 be551aaa-1e26-0410-a405-d3ace91eadb9 --- diff --git a/doc/Changelog b/doc/Changelog index 1fee6faeb..1874a1235 100644 --- a/doc/Changelog +++ b/doc/Changelog @@ -1,3 +1,7 @@ +23 April 2010: Wouter + - Squelch log message: sendto failed permission denied for + 255.255.255.255, it is visible in VERB_DETAIL (verbosity 2). + 22 April 2010: Wouter - tag 1.4.4. - trunk contains 1.4.5 in development. diff --git a/util/net_help.c b/util/net_help.c index 182f39d8e..7b2a3f400 100644 --- a/util/net_help.c +++ b/util/net_help.c @@ -494,6 +494,14 @@ addr_is_ip4mapped(struct sockaddr_storage* addr, socklen_t addrlen) return (memcmp(s, map_prefix, 12) == 0); } +int addr_is_broadcast(struct sockaddr_storage* addr, socklen_t addrlen) +{ + int af = (int)((struct sockaddr_in*)addr)->sin_family; + void* sinaddr = &((struct sockaddr_in*)addr)->sin_addr; + return af == AF_INET && addrlen>=(socklen_t)sizeof(struct sockaddr_in) + && memcmp(sinaddr, "\377\377\377\377", 4) == 0; +} + void sock_list_insert(struct sock_list** list, struct sockaddr_storage* addr, socklen_t len, struct regional* region) { diff --git a/util/net_help.h b/util/net_help.h index 9ac96ebc3..8afa84b26 100644 --- a/util/net_help.h +++ b/util/net_help.h @@ -279,6 +279,14 @@ void addr_to_str(struct sockaddr_storage* addr, socklen_t addrlen, */ int addr_is_ip4mapped(struct sockaddr_storage* addr, socklen_t addrlen); +/** + * See if sockaddr is 255.255.255.255. + * @param addr: address + * @param addrlen: length of address + * @return true if so + */ +int addr_is_broadcast(struct sockaddr_storage* addr, socklen_t addrlen); + /** * Insert new socket list item. If fails logs error. * @param list: pointer to pointer to first item. diff --git a/util/netevent.c b/util/netevent.c index 4b6a0a3ce..3f3c6ce03 100644 --- a/util/netevent.c +++ b/util/netevent.c @@ -301,6 +301,12 @@ comm_point_send_udp_msg(struct comm_point *c, ldns_buffer* packet, (struct sockaddr_storage*)addr, addrlen) && verbosity < VERB_DETAIL) return 0; + /* SO_BROADCAST sockopt can give access to 255.255.255.255, + * but a dns cache does not need it. */ + if(errno == EACCES && addr_is_broadcast( + (struct sockaddr_storage*)addr, addrlen) && + verbosity < VERB_DETAIL) + return 0; #ifndef USE_WINSOCK verbose(VERB_OPS, "sendto failed: %s", strerror(errno)); #else