summaryrefslogtreecommitdiff
path: root/source4/lib
diff options
context:
space:
mode:
Diffstat (limited to 'source4/lib')
-rw-r--r--source4/lib/tls/tls.c39
1 files changed, 26 insertions, 13 deletions
diff --git a/source4/lib/tls/tls.c b/source4/lib/tls/tls.c
index 7bf2ff8e43..db6d1eb5de 100644
--- a/source4/lib/tls/tls.c
+++ b/source4/lib/tls/tls.c
@@ -152,7 +152,7 @@ static ssize_t tls_push(gnutls_transport_ptr ptr, const void *buf, size_t size)
{
struct tls_context *tls = talloc_get_type(ptr, struct tls_context);
NTSTATUS status;
- size_t nwritten;
+ size_t nwritten, total_nwritten = 0;
DATA_BLOB b;
if (!tls->tls_enabled) {
@@ -162,19 +162,32 @@ static ssize_t tls_push(gnutls_transport_ptr ptr, const void *buf, size_t size)
b.data = discard_const(buf);
b.length = size;
- status = socket_send(tls->socket, &b, &nwritten);
- if (NT_STATUS_EQUAL(status, STATUS_MORE_ENTRIES)) {
- errno = EAGAIN;
- return -1;
- }
- if (!NT_STATUS_IS_OK(status)) {
- TEVENT_FD_WRITEABLE(tls->fde);
- return -1;
- }
- if (size != nwritten) {
+ /* Cope with socket_wrapper 1500 byte chunking for PCAP */
+ do {
+ status = socket_send(tls->socket, &b, &nwritten);
+
+ if (NT_STATUS_EQUAL(status, STATUS_MORE_ENTRIES)) {
+ errno = EAGAIN;
+ return -1;
+ }
+ if (!NT_STATUS_IS_OK(status)) {
+ TEVENT_FD_WRITEABLE(tls->fde);
+ return -1;
+ }
+
+ total_nwritten += nwritten;
+
+ if (size == nwritten) {
+ break;
+ }
+
+ b.data += nwritten;
+ b.length -= nwritten;
+
TEVENT_FD_WRITEABLE(tls->fde);
- }
- return nwritten;
+ } while (b.length);
+
+ return total_nwritten;
}
/*