Skip to content

Commit e0c1f6c

Browse files
Anatoliy Koperinrstam
authored andcommitted
CSHARP-1993: Fix invalid seek in GridFS, more tests added
1 parent 4ddd9ef commit e0c1f6c

File tree

2 files changed

+31
-8
lines changed

2 files changed

+31
-8
lines changed

src/MongoDB.Driver.GridFS/GridFSSeekableDownloadStream.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,13 +125,17 @@ public override long Seek(long offset, SeekOrigin origin)
125125
{
126126
case SeekOrigin.Begin: newPosition = offset; break;
127127
case SeekOrigin.Current: newPosition = _position + offset; break;
128-
case SeekOrigin.End: newPosition = _position + offset; break;
128+
case SeekOrigin.End: newPosition = FileInfo.Length + offset; break;
129129
default: throw new ArgumentException("Invalid origin.", "origin");
130130
}
131131
if (newPosition < 0)
132132
{
133133
throw new IOException("Position must be greater than or equal to zero.");
134134
}
135+
if (FileInfo.Length <= newPosition)
136+
{
137+
throw new IOException("Position must be less than to length of stream.");
138+
}
135139
Position = newPosition;
136140
return newPosition;
137141
}

tests/MongoDB.Driver.GridFS.Tests/GridFSSeekableDownloadStreamTests.cs

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -191,28 +191,47 @@ public void Read_should_throw_when_offset_is_invalid(int bufferLength, int offse
191191

192192
[Theory]
193193
[InlineData(0, 1, SeekOrigin.Begin, 1)]
194-
[InlineData(1, 1, SeekOrigin.Current, 2)]
195-
[InlineData(2, -1, SeekOrigin.End, 1)]
194+
[InlineData(5, 1, SeekOrigin.Begin, 1)]
195+
[InlineData(9, 1, SeekOrigin.Begin, 1)]
196+
[InlineData(0, 1, SeekOrigin.Current, 1)]
197+
[InlineData(5, 1, SeekOrigin.Current, 6)]
198+
[InlineData(8, 1, SeekOrigin.Current, 9)]
199+
[InlineData(0, -1, SeekOrigin.End, 9)]
200+
[InlineData(5, -1, SeekOrigin.End, 9)]
201+
[InlineData(9, -1, SeekOrigin.End, 9)]
196202
public void Seek_should_return_expected_result(
197203
long position,
198204
long offset,
199205
SeekOrigin origin,
200206
long expectedResult)
201207
{
202-
var subject = CreateSubject();
208+
var subject = CreateSubject(10);
203209
subject.Position = position;
204210

205211
var result = subject.Seek(offset, origin);
206212

207213
result.Should().Be(expectedResult);
208214
}
209215

210-
[Fact]
211-
public void Seek_should_throw_when_new_position_is_negative()
216+
[Theory]
217+
[InlineData(0, -1, SeekOrigin.Begin)]
218+
[InlineData(5, -1, SeekOrigin.Begin)]
219+
[InlineData(9, 10, SeekOrigin.Begin)]
220+
[InlineData(0, -1, SeekOrigin.Current)]
221+
[InlineData(5, -6, SeekOrigin.Current)]
222+
[InlineData(8, 3, SeekOrigin.Current)]
223+
[InlineData(0, 0, SeekOrigin.End)]
224+
[InlineData(5, 1, SeekOrigin.End)]
225+
[InlineData(9, -11, SeekOrigin.End)]
226+
public void Seek_should_throw_when_new_position_is_out_of_range(
227+
long position,
228+
long offset,
229+
SeekOrigin origin)
212230
{
213-
var subject = CreateSubject();
231+
var subject = CreateSubject(10);
232+
subject.Position = position;
214233

215-
Action action = () => subject.Seek(-1, SeekOrigin.Begin);
234+
Action action = () => subject.Seek(offset, origin);
216235

217236
action.ShouldThrow<IOException>();
218237
}

0 commit comments

Comments
 (0)