summaryrefslogtreecommitdiffstats
path: root/contrib/bind9/lib/isc/unix/socket.c
diff options
context:
space:
mode:
authorerwin <erwin@FreeBSD.org>2013-08-06 06:22:54 +0000
committererwin <erwin@FreeBSD.org>2013-08-06 06:22:54 +0000
commitef27886236495d424b7f096da332d093109780a6 (patch)
treeb4ab3fc36f81b1377b903cb2fe0ca445c0304cbd /contrib/bind9/lib/isc/unix/socket.c
parentc116c25dd59e2f090a93b32234e356ae28d96a02 (diff)
parent414d5ed7dd8cad7ef2738c53f9b9ecfe246ed91c (diff)
downloadFreeBSD-src-ef27886236495d424b7f096da332d093109780a6.zip
FreeBSD-src-ef27886236495d424b7f096da332d093109780a6.tar.gz
Update Bind to 9.8.5-P2
New Features Adds a new configuration option, "check-spf"; valid values are "warn" (default) and "ignore". When set to "warn", checks SPF and TXT records in spf format, warning if either resource record type occurs without a corresponding record of the other resource record type. [RT #33355] Adds support for Uniform Resource Identifier (URI) resource records. [RT #23386] Adds support for the EUI48 and EUI64 RR types. [RT #33082] Adds support for the RFC 6742 ILNP record types (NID, LP, L32, and L64). [RT #31836] Feature Changes Changes timing of when slave zones send NOTIFY messages after loading a new copy of the zone. They now send the NOTIFY before writing the zone data to disk. This will result in quicker propagation of updates in multi-level server structures. [RT #27242] "named -V" can now report a source ID string. (This is will be of most interest to developers and troubleshooters). The source ID for ISC's production versions of BIND is defined in the "srcid" file in the build tree and is normally set to the most recent git hash. [RT #31494] Response Policy Zone performance enhancements. New "response-policy" option "min-ns-dots". "nsip" and "nsdname" now enabled by default with RPZ. [RT #32251] Approved by: delphij (mentor) Sponsored by: DK Hostmaster A/S
Diffstat (limited to 'contrib/bind9/lib/isc/unix/socket.c')
-rw-r--r--contrib/bind9/lib/isc/unix/socket.c206
1 files changed, 118 insertions, 88 deletions
diff --git a/contrib/bind9/lib/isc/unix/socket.c b/contrib/bind9/lib/isc/unix/socket.c
index 9d64a77..d007598 100644
--- a/contrib/bind9/lib/isc/unix/socket.c
+++ b/contrib/bind9/lib/isc/unix/socket.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2012 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2013 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and/or distribute this software for any
@@ -613,7 +613,7 @@ enum {
STATID_SENDFAIL = 8,
STATID_RECVFAIL = 9
};
-static const isc_statscounter_t upd4statsindex[] = {
+static const isc_statscounter_t udp4statsindex[] = {
isc_sockstatscounter_udp4open,
isc_sockstatscounter_udp4openfail,
isc_sockstatscounter_udp4close,
@@ -625,7 +625,7 @@ static const isc_statscounter_t upd4statsindex[] = {
isc_sockstatscounter_udp4sendfail,
isc_sockstatscounter_udp4recvfail
};
-static const isc_statscounter_t upd6statsindex[] = {
+static const isc_statscounter_t udp6statsindex[] = {
isc_sockstatscounter_udp6open,
isc_sockstatscounter_udp6openfail,
isc_sockstatscounter_udp6close,
@@ -1192,7 +1192,7 @@ process_cmsg(isc__socket_t *sock, struct msghdr *msg, isc_socketevent_t *dev) {
struct in6_pktinfo *pktinfop;
#endif
#ifdef SO_TIMESTAMP
- struct timeval *timevalp;
+ void *timevalp;
#endif
#endif
@@ -1259,9 +1259,11 @@ process_cmsg(isc__socket_t *sock, struct msghdr *msg, isc_socketevent_t *dev) {
#ifdef SO_TIMESTAMP
if (cmsgp->cmsg_level == SOL_SOCKET
&& cmsgp->cmsg_type == SCM_TIMESTAMP) {
- timevalp = (struct timeval *)CMSG_DATA(cmsgp);
- dev->timestamp.seconds = timevalp->tv_sec;
- dev->timestamp.nanoseconds = timevalp->tv_usec * 1000;
+ struct timeval tv;
+ timevalp = CMSG_DATA(cmsgp);
+ memcpy(&tv, timevalp, sizeof(tv));
+ dev->timestamp.seconds = tv.tv_sec;
+ dev->timestamp.nanoseconds = tv.tv_usec * 1000;
dev->attributes |= ISC_SOCKEVENTATTR_TIMESTAMP;
goto next;
}
@@ -2052,7 +2054,7 @@ allocate_socket(isc__socketmgr_t *manager, isc_sockettype_t type,
sock->sendcmsgbuf = NULL;
/*
- * set up cmsg buffers
+ * Set up cmsg buffers.
*/
cmsgbuflen = 0;
#if defined(USE_CMSG) && defined(ISC_PLATFORM_HAVEIN6PKTINFO)
@@ -2094,7 +2096,7 @@ allocate_socket(isc__socketmgr_t *manager, isc_sockettype_t type,
sock->tag = NULL;
/*
- * set up list of readers and writers to be initially empty
+ * Set up list of readers and writers to be initially empty.
*/
ISC_LIST_INIT(sock->recv_list);
ISC_LIST_INIT(sock->send_list);
@@ -2109,7 +2111,7 @@ allocate_socket(isc__socketmgr_t *manager, isc_sockettype_t type,
sock->bound = 0;
/*
- * initialize the lock
+ * Initialize the lock.
*/
result = isc_mutex_init(&sock->lock);
if (result != ISC_R_SUCCESS) {
@@ -2119,7 +2121,7 @@ allocate_socket(isc__socketmgr_t *manager, isc_sockettype_t type,
}
/*
- * Initialize readable and writable events
+ * Initialize readable and writable events.
*/
ISC_EVENT_INIT(&sock->readable_ev, sizeof(intev_t),
ISC_EVENTATTR_NOPURGE, NULL, ISC_SOCKEVENT_INTR,
@@ -2223,13 +2225,38 @@ clear_bsdcompat(void) {
}
#endif
+static void
+use_min_mtu(isc__socket_t *sock) {
+#if !defined(IPV6_USE_MIN_MTU) && !defined(IPV6_MTU)
+ UNUSED(sock);
+#endif
+#ifdef IPV6_USE_MIN_MTU
+ /* use minimum MTU */
+ if (sock->pf == AF_INET6) {
+ int on = 1;
+ (void)setsockopt(sock->fd, IPPROTO_IPV6, IPV6_USE_MIN_MTU,
+ (void *)&on, sizeof(on));
+ }
+#endif
+#if defined(IPV6_MTU)
+ /*
+ * Use minimum MTU on IPv6 sockets.
+ */
+ if (sock->pf == AF_INET6) {
+ int mtu = 1280;
+ (void)setsockopt(sock->fd, IPPROTO_IPV6, IPV6_MTU,
+ &mtu, sizeof(mtu));
+ }
+#endif
+}
+
static isc_result_t
opensocket(isc__socketmgr_t *manager, isc__socket_t *sock) {
isc_result_t result;
char strbuf[ISC_STRERRORSIZE];
const char *err = "socket";
int tries = 0;
-#if defined(USE_CMSG) || defined(SO_BSDCOMPAT)
+#if defined(USE_CMSG) || defined(SO_BSDCOMPAT) || defined(SO_NOSIGPIPE)
int on = 1;
#endif
#if defined(SO_RCVBUF)
@@ -2367,6 +2394,11 @@ opensocket(isc__socketmgr_t *manager, isc__socket_t *sock) {
}
#endif
+ /*
+ * Use minimum mtu if possible.
+ */
+ use_min_mtu(sock);
+
#if defined(USE_CMSG) || defined(SO_RCVBUF)
if (sock->type == isc_sockettype_udp) {
@@ -2431,32 +2463,6 @@ opensocket(isc__socketmgr_t *manager, isc__socket_t *sock) {
}
#endif /* IPV6_RECVPKTINFO */
#endif /* ISC_PLATFORM_HAVEIN6PKTINFO */
-#ifdef IPV6_USE_MIN_MTU /* RFC 3542, not too common yet*/
- /* use minimum MTU */
- if (sock->pf == AF_INET6 &&
- setsockopt(sock->fd, IPPROTO_IPV6, IPV6_USE_MIN_MTU,
- (void *)&on, sizeof(on)) < 0) {
- isc__strerror(errno, strbuf, sizeof(strbuf));
- UNEXPECTED_ERROR(__FILE__, __LINE__,
- "setsockopt(%d, IPV6_USE_MIN_MTU) "
- "%s: %s", sock->fd,
- isc_msgcat_get(isc_msgcat,
- ISC_MSGSET_GENERAL,
- ISC_MSG_FAILED,
- "failed"),
- strbuf);
- }
-#endif
-#if defined(IPV6_MTU)
- /*
- * Use minimum MTU on IPv6 sockets.
- */
- if (sock->pf == AF_INET6) {
- int mtu = 1280;
- (void)setsockopt(sock->fd, IPPROTO_IPV6, IPV6_MTU,
- &mtu, sizeof(mtu));
- }
-#endif
#if defined(IPV6_MTU_DISCOVER) && defined(IPV6_PMTUDISC_DONT)
/*
* Turn off Path MTU discovery on IPv6/UDP sockets.
@@ -2546,7 +2552,7 @@ isc__socket_create(isc_socketmgr_t *manager0, int pf, isc_sockettype_t type,
switch (sock->type) {
case isc_sockettype_udp:
sock->statsindex =
- (pf == AF_INET) ? upd4statsindex : upd6statsindex;
+ (pf == AF_INET) ? udp4statsindex : udp6statsindex;
break;
case isc_sockettype_tcp:
sock->statsindex =
@@ -3209,23 +3215,27 @@ internal_accept(isc_task_t *me, isc_event_t *ev) {
if (fd != -1) {
int lockid = FDLOCK_ID(fd);
- LOCK(&manager->fdlock[lockid]);
- manager->fds[fd] = NEWCONNSOCK(dev);
- manager->fdstate[fd] = MANAGED;
- UNLOCK(&manager->fdlock[lockid]);
-
- LOCK(&manager->lock);
- ISC_LIST_APPEND(manager->socklist, NEWCONNSOCK(dev), link);
-
NEWCONNSOCK(dev)->fd = fd;
NEWCONNSOCK(dev)->bound = 1;
NEWCONNSOCK(dev)->connected = 1;
/*
+ * Use minimum mtu if possible.
+ */
+ use_min_mtu(NEWCONNSOCK(dev));
+
+ /*
* Save away the remote address
*/
dev->address = NEWCONNSOCK(dev)->peer_address;
+ LOCK(&manager->fdlock[lockid]);
+ manager->fds[fd] = NEWCONNSOCK(dev);
+ manager->fdstate[fd] = MANAGED;
+ UNLOCK(&manager->fdlock[lockid]);
+
+ LOCK(&manager->lock);
+
#ifdef USE_SELECT
if (manager->maxfd < fd)
manager->maxfd = fd;
@@ -3236,6 +3246,8 @@ internal_accept(isc_task_t *me, isc_event_t *ev) {
"accepted connection, new socket %p",
dev->newsocket);
+ ISC_LIST_APPEND(manager->socklist, NEWCONNSOCK(dev), link);
+
UNLOCK(&manager->lock);
inc_stats(manager->stats, sock->statsindex[STATID_ACCEPT]);
@@ -5851,94 +5863,112 @@ _socktype(isc_sockettype_t type)
return ("not-initialized");
}
-ISC_SOCKETFUNC_SCOPE void
+#define TRY0(a) do { xmlrc = (a); if (xmlrc < 0) goto error; } while(0)
+ISC_SOCKETFUNC_SCOPE int
isc_socketmgr_renderxml(isc_socketmgr_t *mgr0, xmlTextWriterPtr writer) {
isc__socketmgr_t *mgr = (isc__socketmgr_t *)mgr0;
- isc__socket_t *sock;
+ isc__socket_t *sock = NULL;
char peerbuf[ISC_SOCKADDR_FORMATSIZE];
isc_sockaddr_t addr;
ISC_SOCKADDR_LEN_T len;
+ int xmlrc;
LOCK(&mgr->lock);
#ifdef USE_SHARED_MANAGER
- xmlTextWriterStartElement(writer, ISC_XMLCHAR "references");
- xmlTextWriterWriteFormatString(writer, "%d", mgr->refs);
- xmlTextWriterEndElement(writer);
+ TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "references"));
+ TRY0(xmlTextWriterWriteFormatString(writer, "%d", mgr->refs));
+ TRY0(xmlTextWriterEndElement(writer));
#endif /* USE_SHARED_MANAGER */
- xmlTextWriterStartElement(writer, ISC_XMLCHAR "sockets");
+ TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "sockets"));
sock = ISC_LIST_HEAD(mgr->socklist);
while (sock != NULL) {
LOCK(&sock->lock);
- xmlTextWriterStartElement(writer, ISC_XMLCHAR "socket");
+ TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "socket"));
- xmlTextWriterStartElement(writer, ISC_XMLCHAR "id");
- xmlTextWriterWriteFormatString(writer, "%p", sock);
- xmlTextWriterEndElement(writer);
+ TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "id"));
+ TRY0(xmlTextWriterWriteFormatString(writer, "%p", sock));
+ TRY0(xmlTextWriterEndElement(writer));
if (sock->name[0] != 0) {
- xmlTextWriterStartElement(writer, ISC_XMLCHAR "name");
- xmlTextWriterWriteFormatString(writer, "%s",
- sock->name);
- xmlTextWriterEndElement(writer); /* name */
+ TRY0(xmlTextWriterStartElement(writer,
+ ISC_XMLCHAR "name"));
+ TRY0(xmlTextWriterWriteFormatString(writer, "%s",
+ sock->name));
+ TRY0(xmlTextWriterEndElement(writer)); /* name */
}
- xmlTextWriterStartElement(writer, ISC_XMLCHAR "references");
- xmlTextWriterWriteFormatString(writer, "%d", sock->references);
- xmlTextWriterEndElement(writer);
+ TRY0(xmlTextWriterStartElement(writer,
+ ISC_XMLCHAR "references"));
+ TRY0(xmlTextWriterWriteFormatString(writer, "%d",
+ sock->references));
+ TRY0(xmlTextWriterEndElement(writer));
- xmlTextWriterWriteElement(writer, ISC_XMLCHAR "type",
- ISC_XMLCHAR _socktype(sock->type));
+ TRY0(xmlTextWriterWriteElement(writer, ISC_XMLCHAR "type",
+ ISC_XMLCHAR _socktype(sock->type)));
if (sock->connected) {
isc_sockaddr_format(&sock->peer_address, peerbuf,
sizeof(peerbuf));
- xmlTextWriterWriteElement(writer,
+ TRY0(xmlTextWriterWriteElement(writer,
ISC_XMLCHAR "peer-address",
- ISC_XMLCHAR peerbuf);
+ ISC_XMLCHAR peerbuf));
}
len = sizeof(addr);
if (getsockname(sock->fd, &addr.type.sa, (void *)&len) == 0) {
isc_sockaddr_format(&addr, peerbuf, sizeof(peerbuf));
- xmlTextWriterWriteElement(writer,
+ TRY0(xmlTextWriterWriteElement(writer,
ISC_XMLCHAR "local-address",
- ISC_XMLCHAR peerbuf);
+ ISC_XMLCHAR peerbuf));
}
- xmlTextWriterStartElement(writer, ISC_XMLCHAR "states");
+ TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "states"));
if (sock->pending_recv)
- xmlTextWriterWriteElement(writer, ISC_XMLCHAR "state",
- ISC_XMLCHAR "pending-receive");
+ TRY0(xmlTextWriterWriteElement(writer,
+ ISC_XMLCHAR "state",
+ ISC_XMLCHAR "pending-receive"));
if (sock->pending_send)
- xmlTextWriterWriteElement(writer, ISC_XMLCHAR "state",
- ISC_XMLCHAR "pending-send");
+ TRY0(xmlTextWriterWriteElement(writer,
+ ISC_XMLCHAR "state",
+ ISC_XMLCHAR "pending-send"));
if (sock->pending_accept)
- xmlTextWriterWriteElement(writer, ISC_XMLCHAR "state",
- ISC_XMLCHAR "pending_accept");
+ TRY0(xmlTextWriterWriteElement(writer,
+ ISC_XMLCHAR "state",
+ ISC_XMLCHAR "pending_accept"));
if (sock->listener)
- xmlTextWriterWriteElement(writer, ISC_XMLCHAR "state",
- ISC_XMLCHAR "listener");
+ TRY0(xmlTextWriterWriteElement(writer,
+ ISC_XMLCHAR "state",
+ ISC_XMLCHAR "listener"));
if (sock->connected)
- xmlTextWriterWriteElement(writer, ISC_XMLCHAR "state",
- ISC_XMLCHAR "connected");
+ TRY0(xmlTextWriterWriteElement(writer,
+ ISC_XMLCHAR "state",
+ ISC_XMLCHAR "connected"));
if (sock->connecting)
- xmlTextWriterWriteElement(writer, ISC_XMLCHAR "state",
- ISC_XMLCHAR "connecting");
+ TRY0(xmlTextWriterWriteElement(writer,
+ ISC_XMLCHAR "state",
+ ISC_XMLCHAR "connecting"));
if (sock->bound)
- xmlTextWriterWriteElement(writer, ISC_XMLCHAR "state",
- ISC_XMLCHAR "bound");
+ TRY0(xmlTextWriterWriteElement(writer,
+ ISC_XMLCHAR "state",
+ ISC_XMLCHAR "bound"));
- xmlTextWriterEndElement(writer); /* states */
+ TRY0(xmlTextWriterEndElement(writer)); /* states */
- xmlTextWriterEndElement(writer); /* socket */
+ TRY0(xmlTextWriterEndElement(writer)); /* socket */
UNLOCK(&sock->lock);
sock = ISC_LIST_NEXT(sock, link);
}
- xmlTextWriterEndElement(writer); /* sockets */
+ TRY0(xmlTextWriterEndElement(writer)); /* sockets */
+
+ error:
+ if (sock != NULL)
+ UNLOCK(&sock->lock);
UNLOCK(&mgr->lock);
+
+ return (xmlrc);
}
#endif /* HAVE_LIBXML2 */
OpenPOWER on IntegriCloud