From a1a842eb44b5bbb59af445af7a2c4a00e8c0188a Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Fri, 21 Jul 2006 01:34:56 +0000 Subject: r17168: Now that TLS (and soon SASL) is below the socket layer, we need to make the testnonblock skip some things. The socket *under* the tls socket is still tested. Andrew Bartlett (This used to be commit 9c33c6a20a77e3f15eac3d62488117517afad940) --- source4/lib/socket/socket.c | 34 +++++++++++++++++++++++----------- source4/lib/socket/socket.h | 1 + 2 files changed, 24 insertions(+), 11 deletions(-) (limited to 'source4/lib/socket') diff --git a/source4/lib/socket/socket.c b/source4/lib/socket/socket.c index e1f8bb4d86..ac64bc4ddc 100644 --- a/source4/lib/socket/socket.c +++ b/source4/lib/socket/socket.c @@ -66,6 +66,7 @@ _PUBLIC_ NTSTATUS socket_create_with_ops(TALLOC_CTX *mem_ctx, const struct socke /* by enabling "testnonblock" mode, all socket receive and send calls on non-blocking sockets will randomly recv/send less data than requested */ + if (!(flags & SOCKET_FLAG_BLOCK) && type == SOCKET_TYPE_STREAM && lp_parm_bool(-1, "socket", "testnonblock", False)) { @@ -185,14 +186,21 @@ _PUBLIC_ NTSTATUS socket_recv(struct socket_context *sock, void *buf, return NT_STATUS_NOT_IMPLEMENTED; } - if ((sock->flags & SOCKET_FLAG_TESTNONBLOCK) && wantlen > 1) { - if (random() % 10 == 0) { - *nread = 0; - return STATUS_MORE_ENTRIES; + if ((sock->flags & SOCKET_FLAG_TESTNONBLOCK) + && wantlen > 1) { + + /* The returning of 0 and MORE_ENTRIES is incompatible + with TLS and SASL sockets, as there is not a + constant event source to re-trigger the reads */ + + if (!(sock->flags & SOCKET_FLAG_FAKE)) { + if (random() % 10 == 0) { + *nread = 0; + return STATUS_MORE_ENTRIES; + } } return sock->ops->fn_recv(sock, buf, 1+(random() % wantlen), nread); } - return sock->ops->fn_recv(sock, buf, wantlen, nread); } @@ -229,17 +237,21 @@ _PUBLIC_ NTSTATUS socket_send(struct socket_context *sock, if (!sock->ops->fn_send) { return NT_STATUS_NOT_IMPLEMENTED; } - - if ((sock->flags & SOCKET_FLAG_TESTNONBLOCK) && blob->length > 1) { - DATA_BLOB blob2 = *blob; + + if ((sock->flags & SOCKET_FLAG_TESTNONBLOCK) + && blob->length > 1) { if (random() % 10 == 0) { *sendlen = 0; return STATUS_MORE_ENTRIES; } - blob2.length = 1+(random() % blob2.length); - return sock->ops->fn_send(sock, &blob2, sendlen); + /* The variable size sends are incompatilbe with TLS and SASL + * sockets, which require re-sends to be consistant */ + if (!(sock->flags & SOCKET_FLAG_FAKE)) { + DATA_BLOB blob2 = *blob; + blob2.length = 1+(random() % blob2.length); + return sock->ops->fn_send(sock, &blob2, sendlen); + } } - return sock->ops->fn_send(sock, blob, sendlen); } diff --git a/source4/lib/socket/socket.h b/source4/lib/socket/socket.h index fefa999e08..c0cf429887 100644 --- a/source4/lib/socket/socket.h +++ b/source4/lib/socket/socket.h @@ -102,6 +102,7 @@ enum socket_state { #define SOCKET_FLAG_BLOCK 0x00000001 #define SOCKET_FLAG_PEEK 0x00000002 #define SOCKET_FLAG_TESTNONBLOCK 0x00000004 +#define SOCKET_FLAG_FAKE 0x00000008 /* This is an implementation not directly on top of a real socket */ struct socket_context { enum socket_type type; -- cgit