| ... | @@ -725,8 +725,11 @@ pub fn writeAll(c: *Client, stream: net.Stream, bytes: []const u8) !void { | ... | @@ -725,8 +725,11 @@ pub fn writeAll(c: *Client, stream: net.Stream, bytes: []const u8) !void { |
| 725 | | 725 | |
| 726 | /// Returns number of bytes that have been read, which are now populated inside | 726 | /// Returns number of bytes that have been read, which are now populated inside |
| 727 | /// `buffer`. A return value of zero bytes does not necessarily mean end of | 727 | /// `buffer`. A return value of zero bytes does not necessarily mean end of |
| 728 | /// stream. | 728 | /// stream. Instead, the `eof` flag is set upon end of stream. The `eof` flag |
| | 729 | /// may be set after any call to `read`, including when greater than zero bytes |
| | 730 | /// are returned, and this function asserts that `eof` is `false`. |
| 729 | pub fn read(c: *Client, stream: net.Stream, buffer: []u8) !usize { | 731 | pub fn read(c: *Client, stream: net.Stream, buffer: []u8) !usize { |
| | 732 | assert(!c.eof); |
| 730 | const prev_len = c.partially_read_len; | 733 | const prev_len = c.partially_read_len; |
| 731 | var in_buf: [max_ciphertext_len * 4]u8 = undefined; | 734 | var in_buf: [max_ciphertext_len * 4]u8 = undefined; |
| 732 | mem.copy(u8, &in_buf, c.partially_read_buffer[0..prev_len]); | 735 | mem.copy(u8, &in_buf, c.partially_read_buffer[0..prev_len]); |
| ... | @@ -738,8 +741,8 @@ pub fn read(c: *Client, stream: net.Stream, buffer: []u8) !usize { | ... | @@ -738,8 +741,8 @@ pub fn read(c: *Client, stream: net.Stream, buffer: []u8) !usize { |
| 738 | const actual_read_len = try stream.read(ask_slice); | 741 | const actual_read_len = try stream.read(ask_slice); |
| 739 | const frag = in_buf[0 .. prev_len + actual_read_len]; | 742 | const frag = in_buf[0 .. prev_len + actual_read_len]; |
| 740 | if (frag.len == 0) { | 743 | if (frag.len == 0) { |
| 741 | c.eof = true; | 744 | // This is either a truncation attack, or a bug in the server. |
| 742 | return 0; | 745 | return error.TlsConnectionTruncated; |
| 743 | } | 746 | } |
| 744 | var in: usize = 0; | 747 | var in: usize = 0; |
| 745 | var out: usize = 0; | 748 | var out: usize = 0; |