Skip to content

Commit

Permalink
Merge pull request #2722 from vibe-d/bufferedstream_fix
Browse files Browse the repository at this point in the history
Fix a slice index error when seeking past end of file, but within the last cached chunk
  • Loading branch information
l-kramer committed Apr 3, 2023
2 parents 3c3340f + 28123dc commit bd55f3c
Showing 1 changed file with 21 additions and 1 deletion.
22 changes: 21 additions & 1 deletion stream/vibe/stream/bufferedstream.d
Expand Up @@ -366,7 +366,7 @@ struct BufferedStream(S) {
ubyte[1] dummy;
state.peekBuffer = null;
state.iterateChunks!ubyte(offset, dummy[], (offset, chunk, scope bytes, buffer, buffer_begin, buffer_end) @safe nothrow {
if (buffer >= 0) {
if (buffer >= 0 && buffer_begin < state.buffers[buffer].fill) {
state.peekBuffer = state.buffers[buffer].memory[buffer_begin .. state.buffers[buffer].fill];
state.touchBuffer(buffer);
}
Expand Down Expand Up @@ -569,6 +569,26 @@ mixin validateRandomAccessStream!(BufferedStream!RandomAccessStream);
assert(ob[0] == 1);
}

@safe unittest { // regression seeking past end of file within the last chunk
import std.exception : assertThrown;
import vibe.stream.memory : createMemoryStream;
import vibe.stream.operations : readAll;

auto buf = new ubyte[](256);
foreach (i, ref b; buf) b = cast(ubyte)i;
auto str = createMemoryStream(buf, true, 1);
auto bstr = bufferedStream(str, 16, 4);

ubyte[1] ob;
bstr.read(ob[]);
assert(ob[0] == 0);
bstr.seek(10);
bstr.write([cast(ubyte)1]);
bstr.seek(10);
bstr.read(ob[]);
assert(ob[0] == 1);
}

unittest {
static assert(isTruncatableStream!(BufferedStream!TruncatableStream));
static assert(isClosableRandomAccessStream!(BufferedStream!ClosableRandomAccessStream));
Expand Down

0 comments on commit bd55f3c

Please sign in to comment.