/* 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)) {
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);
}
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);
}
NTSTATUS nt_status;
nt_status = socket_create_with_ops(socket, &tls_socket_ops, &new_sock,
- SOCKET_TYPE_STREAM, 0);
+ SOCKET_TYPE_STREAM,
+ socket->flags | SOCKET_FLAG_FAKE);
if (!NT_STATUS_IS_OK(nt_status)) {
return NULL;
}
NTSTATUS nt_status;
nt_status = socket_create_with_ops(socket, &tls_socket_ops, &new_sock,
- SOCKET_TYPE_STREAM, 0);
+ SOCKET_TYPE_STREAM,
+ socket->flags | SOCKET_FLAG_FAKE);
if (!NT_STATUS_IS_OK(nt_status)) {
return NULL;
}