| ... | ... | @@ -17,7 +17,6 @@ const State = union(enum) { |
| 17 | 17 | new_frame, |
| 18 | 18 | in_frame: InFrame, |
| 19 | 19 | skipping_frame: usize, |
| 20 | | end, |
| 21 | 20 | |
| 22 | 21 | const InFrame = struct { |
| 23 | 22 | frame: Frame, |
| ... | ... | @@ -158,7 +157,18 @@ fn stream(r: *Reader, w: *Writer, limit: Limit) Reader.StreamError!usize { |
| 158 | 157 | |
| 159 | 158 | switch (d.state) { |
| 160 | 159 | .new_frame => { |
| 161 | | // Allow error.EndOfStream only on the frame magic. |
| 160 | // Only return EndOfStream when there are exactly 0 bytes remaining on the |
| 161 | // frame magic. Any partial magic bytes should be considered a failure. |
| 162 | in.fill(@sizeOf(Frame.Magic)) catch |err| switch (err) { |
| 163 | error.EndOfStream => { |
| 164 | if (in.bufferedLen() != 0) { |
| 165 | d.err = error.BadMagic; |
| 166 | return error.ReadFailed; |
| 167 | } |
| 168 | return err; |
| 169 | }, |
| 170 | else => |e| return e, |
| 171 | }; |
| 162 | 172 | const magic = try in.takeEnumNonexhaustive(Frame.Magic, .little); |
| 163 | 173 | initFrame(d, w.buffer.len, magic) catch |err| { |
| 164 | 174 | d.err = err; |
| ... | ... | @@ -192,7 +202,6 @@ fn stream(r: *Reader, w: *Writer, limit: Limit) Reader.StreamError!usize { |
| 192 | 202 | if (remaining.* == 0) d.state = .new_frame; |
| 193 | 203 | return 0; |
| 194 | 204 | }, |
| 195 | | .end => return error.EndOfStream, |
| 196 | 205 | } |
| 197 | 206 | } |
| 198 | 207 | |