s4:tls_tstream: also use a dynamic buffer for the pull side
[metze/samba/wip.git] / source4 / lib / tls / tls_tstream.c
index e1137571a54fe1cdccda7a1718b8e67eee1d4f0d..c64b2eaa490df78badaa124297388e68f723f51a 100644 (file)
@@ -58,7 +58,7 @@ struct tstream_tls {
        } push;
 
        struct {
-               uint8_t buffer[1024];
+               uint8_t *buf;
                struct iovec iov;
                struct tevent_req *subreq;
        } pull;
@@ -293,6 +293,7 @@ static ssize_t tstream_tls_pull_function(gnutls_transport_ptr ptr,
                tstream_context_data(stream,
                struct tstream_tls);
        struct tevent_req *subreq;
+       size_t len;
 
        if (tlss->error != 0) {
                errno = tlss->error;
@@ -305,14 +306,20 @@ static ssize_t tstream_tls_pull_function(gnutls_transport_ptr ptr,
        }
 
        if (tlss->pull.iov.iov_base) {
+               uint8_t *b;
                size_t n;
 
+               b = (uint8_t *)tlss->pull.iov.iov_base;
+
                n = MIN(tlss->pull.iov.iov_len, size);
-               memcpy(buf, tlss->pull.iov.iov_base, n);
+               memcpy(buf, b, n);
 
                tlss->pull.iov.iov_len -= n;
+               b += n;
+               tlss->pull.iov.iov_base = (char *)b;
                if (tlss->pull.iov.iov_len == 0) {
                        tlss->pull.iov.iov_base = NULL;
+                       TALLOC_FREE(tlss->pull.buf);
                }
 
                return n;
@@ -322,8 +329,15 @@ static ssize_t tstream_tls_pull_function(gnutls_transport_ptr ptr,
                return 0;
        }
 
-       tlss->pull.iov.iov_base = tlss->pull.buffer;
-       tlss->pull.iov.iov_len = MIN(size, sizeof(tlss->pull.buffer));
+       len = MIN(size, UINT16_MAX);
+
+       tlss->pull.buf = talloc_array(tlss, uint8_t, len);
+       if (tlss->pull.buf == NULL) {
+               return -1;
+       }
+
+       tlss->pull.iov.iov_base = (char *)tlss->pull.buf;
+       tlss->pull.iov.iov_len = len;
 
        subreq = tstream_readv_send(tlss,
                                    tlss->current_ev,