Check write/read Slice out of bounds
This commit is contained in:
parent
717166e668
commit
5679a4b455
3 changed files with 22 additions and 2 deletions
|
@ -67,6 +67,9 @@ class BufferWriter {
|
||||||
this.offset += varuint.encode.bytes;
|
this.offset += varuint.encode.bytes;
|
||||||
}
|
}
|
||||||
writeSlice(slice) {
|
writeSlice(slice) {
|
||||||
|
if (this.buffer.length < this.offset + slice.length) {
|
||||||
|
throw new Error('Cannot write slice out of bounds');
|
||||||
|
}
|
||||||
this.offset += slice.copy(this.buffer, this.offset);
|
this.offset += slice.copy(this.buffer, this.offset);
|
||||||
}
|
}
|
||||||
writeVarSlice(slice) {
|
writeVarSlice(slice) {
|
||||||
|
@ -114,8 +117,12 @@ class BufferReader {
|
||||||
return vi;
|
return vi;
|
||||||
}
|
}
|
||||||
readSlice(n) {
|
readSlice(n) {
|
||||||
|
if (this.buffer.length < this.offset + n) {
|
||||||
|
throw new Error('Cannot read slice out of bounds');
|
||||||
|
}
|
||||||
|
const result = this.buffer.slice(this.offset, this.offset + n);
|
||||||
this.offset += n;
|
this.offset += n;
|
||||||
return this.buffer.slice(this.offset - n, this.offset);
|
return result;
|
||||||
}
|
}
|
||||||
readVarSlice() {
|
readVarSlice() {
|
||||||
return this.readSlice(this.readVarInt());
|
return this.readSlice(this.readVarInt());
|
||||||
|
|
|
@ -209,6 +209,9 @@ describe('bufferutils', () => {
|
||||||
testBuffer(bufferWriter, expectedBuffer, expectedOffset);
|
testBuffer(bufferWriter, expectedBuffer, expectedOffset);
|
||||||
});
|
});
|
||||||
testBuffer(bufferWriter, expectedBuffer);
|
testBuffer(bufferWriter, expectedBuffer);
|
||||||
|
assert.throws(() => {
|
||||||
|
bufferWriter.writeSlice(Buffer.from([0, 0]));
|
||||||
|
}, /^Error: Cannot write slice out of bounds$/);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('writeVarSlice', () => {
|
it('writeVarSlice', () => {
|
||||||
|
@ -421,6 +424,9 @@ describe('bufferutils', () => {
|
||||||
const val = bufferReader.readSlice(v.length);
|
const val = bufferReader.readSlice(v.length);
|
||||||
testValue(bufferReader, val, Buffer.from(v), expectedOffset);
|
testValue(bufferReader, val, Buffer.from(v), expectedOffset);
|
||||||
});
|
});
|
||||||
|
assert.throws(() => {
|
||||||
|
bufferReader.readSlice(2);
|
||||||
|
}, /^Error: Cannot read slice out of bounds$/);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('readVarSlice', () => {
|
it('readVarSlice', () => {
|
||||||
|
|
|
@ -78,6 +78,9 @@ export class BufferWriter {
|
||||||
}
|
}
|
||||||
|
|
||||||
writeSlice(slice: Buffer): void {
|
writeSlice(slice: Buffer): void {
|
||||||
|
if (this.buffer.length < this.offset + slice.length) {
|
||||||
|
throw new Error('Cannot write slice out of bounds');
|
||||||
|
}
|
||||||
this.offset += slice.copy(this.buffer, this.offset);
|
this.offset += slice.copy(this.buffer, this.offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -131,8 +134,12 @@ export class BufferReader {
|
||||||
}
|
}
|
||||||
|
|
||||||
readSlice(n: number): Buffer {
|
readSlice(n: number): Buffer {
|
||||||
|
if (this.buffer.length < this.offset + n) {
|
||||||
|
throw new Error('Cannot read slice out of bounds');
|
||||||
|
}
|
||||||
|
const result = this.buffer.slice(this.offset, this.offset + n);
|
||||||
this.offset += n;
|
this.offset += n;
|
||||||
return this.buffer.slice(this.offset - n, this.offset);
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
readVarSlice(): Buffer {
|
readVarSlice(): Buffer {
|
||||||
|
|
Loading…
Add table
Reference in a new issue