diff --git a/lib/std/crypto/tls/Client.zig b/lib/std/crypto/tls/Client.zig index 7c97a2ead058b396a40d9b78c87f39dab64c8fcc..920cc8b9dfbe050cdba7bb4738cfc7876fa3b2a2 100644 --- a/lib/std/crypto/tls/Client.zig +++ b/lib/std/crypto/tls/Client.zig @@ -923,21 +923,23 @@ pub fn readvAdvanced(c: *Client, stream: anytype, iovecs: []const std.os.iovec) if (partial_cleartext.len > 0) { const amt = @intCast(u15, vp.put(partial_cleartext)); c.partial_cleartext_idx += amt; - if (amt < partial_cleartext.len) { - // We still have cleartext left so we cannot issue another read() call yet. - assert(vp.total == amt); - return amt; - } - if (c.received_close_notify) { - c.partial_ciphertext_end = 0; - assert(vp.total == amt); - return amt; - } + if (c.partial_ciphertext_end == c.partial_ciphertext_idx) { + // The buffer is now empty. c.partial_cleartext_idx = 0; c.partial_ciphertext_idx = 0; c.partial_ciphertext_end = 0; } + + if (c.received_close_notify) { + c.partial_ciphertext_end = 0; + assert(vp.total == amt); + return amt; + } else if (amt <= partial_cleartext.len) { + // We don't need more data, so don't call read. + assert(vp.total == amt); + return amt; + } } assert(!c.received_close_notify);