diff --git a/lib/std/crypto/tls/Client.zig b/lib/std/crypto/tls/Client.zig index 7c97a2ead0..920cc8b9df 100644 --- a/lib/std/crypto/tls/Client.zig +++ b/lib/std/crypto/tls/Client.zig @@ -923,20 +923,22 @@ 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.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; - } - if (c.partial_ciphertext_end == c.partial_ciphertext_idx) { - c.partial_cleartext_idx = 0; - c.partial_ciphertext_idx = 0; - c.partial_ciphertext_end = 0; + } else if (amt <= partial_cleartext.len) { + // We don't need more data, so don't call read. + assert(vp.total == amt); + return amt; } }