Skip to content

Commit 5679a4b

Browse files
committed
Check write/read Slice out of bounds
1 parent 717166e commit 5679a4b

File tree

3 files changed

+22
-2
lines changed

3 files changed

+22
-2
lines changed

src/bufferutils.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,9 @@ class BufferWriter {
6767
this.offset += varuint.encode.bytes;
6868
}
6969
writeSlice(slice) {
70+
if (this.buffer.length < this.offset + slice.length) {
71+
throw new Error('Cannot write slice out of bounds');
72+
}
7073
this.offset += slice.copy(this.buffer, this.offset);
7174
}
7275
writeVarSlice(slice) {
@@ -114,8 +117,12 @@ class BufferReader {
114117
return vi;
115118
}
116119
readSlice(n) {
120+
if (this.buffer.length < this.offset + n) {
121+
throw new Error('Cannot read slice out of bounds');
122+
}
123+
const result = this.buffer.slice(this.offset, this.offset + n);
117124
this.offset += n;
118-
return this.buffer.slice(this.offset - n, this.offset);
125+
return result;
119126
}
120127
readVarSlice() {
121128
return this.readSlice(this.readVarInt());

test/bufferutils.spec.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,9 @@ describe('bufferutils', () => {
209209
testBuffer(bufferWriter, expectedBuffer, expectedOffset);
210210
});
211211
testBuffer(bufferWriter, expectedBuffer);
212+
assert.throws(() => {
213+
bufferWriter.writeSlice(Buffer.from([0, 0]));
214+
}, /^Error: Cannot write slice out of bounds$/);
212215
});
213216

214217
it('writeVarSlice', () => {
@@ -421,6 +424,9 @@ describe('bufferutils', () => {
421424
const val = bufferReader.readSlice(v.length);
422425
testValue(bufferReader, val, Buffer.from(v), expectedOffset);
423426
});
427+
assert.throws(() => {
428+
bufferReader.readSlice(2);
429+
}, /^Error: Cannot read slice out of bounds$/);
424430
});
425431

426432
it('readVarSlice', () => {

ts_src/bufferutils.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,9 @@ export class BufferWriter {
7878
}
7979

8080
writeSlice(slice: Buffer): void {
81+
if (this.buffer.length < this.offset + slice.length) {
82+
throw new Error('Cannot write slice out of bounds');
83+
}
8184
this.offset += slice.copy(this.buffer, this.offset);
8285
}
8386

@@ -131,8 +134,12 @@ export class BufferReader {
131134
}
132135

133136
readSlice(n: number): Buffer {
137+
if (this.buffer.length < this.offset + n) {
138+
throw new Error('Cannot read slice out of bounds');
139+
}
140+
const result = this.buffer.slice(this.offset, this.offset + n);
134141
this.offset += n;
135-
return this.buffer.slice(this.offset - n, this.offset);
142+
return result;
136143
}
137144

138145
readVarSlice(): Buffer {

0 commit comments

Comments
 (0)