From 51ad49cbf663b2cb8f298c9328c50ffb576135a8 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Mon, 4 Mar 2013 14:07:38 +1100 Subject: [PATCH 1/2] s4-lib/socket: Return the original EMSGSIZE when sendto() and setsockopt() both fail This ensures that should we be unable to increase the socket size, we return an error that the application layer above might expect and be able to make as reasonable response to (such as switching to a stream-based transport). This fixes up c692bb02b039ae8fef6ba968fd13b36ad7d62a72. As suggested by metze in https://bugzilla.samba.org/show_bug.cgi?id=9697#c4 Andrew Bartlett Reviewed-by: Stefan Metzmacher (cherry picked from commit 50b42d1c5bb19e3a5050d7d23ac96e273d3974ee) --- source4/lib/socket/socket_unix.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source4/lib/socket/socket_unix.c b/source4/lib/socket/socket_unix.c index 049e570..0774b12 100644 --- a/source4/lib/socket/socket_unix.c +++ b/source4/lib/socket/socket_unix.c @@ -295,7 +295,7 @@ static NTSTATUS unixdom_sendto(struct socket_context *sock, if (setsockopt(sock->fd, SOL_SOCKET, SO_SNDBUF, &bufsize, sizeof(bufsize)) == -1) { - return map_nt_error_from_unix_common(errno); + return map_nt_error_from_unix_common(EMSGSIZE); } len = sendto(sock->fd, blob->data, blob->length, 0, sa, sa_len); } -- 1.7.11.7 From 7b3bcb32b30ac6cba3f0b2c3f93ed2d1c1c12212 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Mon, 4 Mar 2013 14:06:14 +1100 Subject: [PATCH 2/2] tsocket_bsd: Attempt to increase the SO_SNDBUF if we get EMSGSIZE in sendto() This matches what was done for lib/socket/socket_unix.c in c692bb02b039ae8fef6ba968fd13b36ad7d62a72. (and is based on that patch by Landon Fuller ) Andrew Bartlett Reviewed-by: Stefan Metzmacher Autobuild-User(master): Stefan Metzmacher Autobuild-Date(master): Mon Mar 4 11:15:35 CET 2013 on sn-devel-104 (cherry picked from commit 70e1b6185e3fb35fdc72eeb529ffb4b50122dc40) --- lib/tsocket/tsocket_bsd.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/lib/tsocket/tsocket_bsd.c b/lib/tsocket/tsocket_bsd.c index 56dff68..4b54d31 100644 --- a/lib/tsocket/tsocket_bsd.c +++ b/lib/tsocket/tsocket_bsd.c @@ -1102,6 +1102,32 @@ static void tdgram_bsd_sendto_handler(void *private_data) /* retry later */ return; } + + if (err == EMSGSIZE) { + /* round up in 1K increments */ + int bufsize = ((state->len + 1023) & (~1023)); + + ret = setsockopt(bsds->fd, SOL_SOCKET, SO_SNDBUF, &bufsize, + sizeof(bufsize)); + if (ret == 0) { + /* + * We do the rety here, rather then via the + * handler, as we only want to retry once for + * this condition, so if there is a mismatch + * between what setsockopt() accepts and what can + * actually be sent, we do not end up in a + * loop. + */ + + ret = sendto(bsds->fd, state->buf, state->len, + 0, sa, sa_socklen); + err = tsocket_bsd_error_from_errno(ret, errno, &retry); + if (retry) { /* retry later */ + return; + } + } + } + if (tevent_req_error(req, err)) { return; } -- 1.7.11.7