1
0
mirror of https://github.com/samba-team/samba.git synced 2025-08-04 08:22:08 +03:00

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 9c33c6a20a)
This commit is contained in:
Andrew Bartlett
2006-07-21 01:34:56 +00:00
committed by Gerald (Jerry) Carter
parent dc2715b49c
commit a1a842eb44
4 changed files with 29 additions and 14 deletions

View File

@ -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);
}