Skip to content

Commit b5f741d

Browse files
committed
Clone on ByteBuffer#wrap(ByteBuffer)
1 parent e3b0542 commit b5f741d

File tree

7 files changed

+53
-22
lines changed

7 files changed

+53
-22
lines changed

ByteBuffer.js

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,15 @@
181181
b = new Uint8Array(buffer).buffer; // noop on node <= 0.8
182182
buffer = (b === buffer) ? toArrayBuffer(buffer) : b;
183183
}
184-
// Wrap anything that is or contains an ArrayBuffer
184+
// Refuse to wrap anything that's null or not an object
185+
if (buffer === null || typeof buffer !== 'object') {
186+
throw(new Error("Cannot wrap null or non-object"));
187+
}
188+
// Wrap ByteBuffer by cloning (preserve offsets)
189+
if (buffer instanceof ByteBuffer) {
190+
return buffer.clone();
191+
}
192+
// Wrap any object that is or contains an ArrayBuffer
185193
if (!!buffer["array"]) {
186194
buffer = buffer["array"];
187195
} else if (!!buffer["buffer"]) {
@@ -1070,7 +1078,9 @@
10701078
var value = 0 >>> 0;
10711079
do {
10721080
b = src.getUint8(offset+count);
1073-
value |= ((b&0x7F)<<(7*count)) >>> 0;
1081+
if (count < ByteBuffer.MAX_VARINT32_BYTES) {
1082+
value |= ((b&0x7F)<<(7*count)) >>> 0;
1083+
}
10741084
++count;
10751085
} while (b & 0x80);
10761086
value = value | 0; // Make sure to discard the higher order bits

ByteBuffer.min.js

Lines changed: 10 additions & 10 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

ByteBuffer.min.map

Lines changed: 2 additions & 2 deletions
Large diffs are not rendered by default.

ByteBuffer.noexpose.js

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,15 @@
168168
b = new Uint8Array(buffer).buffer; // noop on node <= 0.8
169169
buffer = (b === buffer) ? toArrayBuffer(buffer) : b;
170170
}
171-
// Wrap anything that is or contains an ArrayBuffer
171+
// Refuse to wrap anything that's null or not an object
172+
if (buffer === null || typeof buffer !== 'object') {
173+
throw(new Error("Cannot wrap null or non-object"));
174+
}
175+
// Wrap ByteBuffer by cloning (preserve offsets)
176+
if (buffer instanceof ByteBuffer) {
177+
return buffer.clone();
178+
}
179+
// Wrap any object that is or contains an ArrayBuffer
172180
if (!!buffer["array"]) {
173181
buffer = buffer["array"];
174182
} else if (!!buffer["buffer"]) {
@@ -1004,7 +1012,9 @@
10041012
var value = 0 >>> 0;
10051013
do {
10061014
b = src.getUint8(offset+count);
1007-
value |= ((b&0x7F)<<(7*count)) >>> 0;
1015+
if (count < ByteBuffer.MAX_VARINT32_BYTES) {
1016+
value |= ((b&0x7F)<<(7*count)) >>> 0;
1017+
}
10081018
++count;
10091019
} while (b & 0x80);
10101020
value = value | 0; // Make sure to discard the higher order bits

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "bytebuffer",
3-
"version": "1.4.0",
3+
"version": "1.4.1",
44
"author": "Daniel Wirtz <[email protected]>",
55
"description": "ByteBuffer.js: A Java-like, Netty-inspired ByteBuffer implementation using typed arrays.",
66
"main": "ByteBuffer.js",

src/ByteBuffer.js

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,15 @@
181181
b = new Uint8Array(buffer).buffer; // noop on node <= 0.8
182182
buffer = (b === buffer) ? toArrayBuffer(buffer) : b;
183183
}
184-
// Wrap anything that is or contains an ArrayBuffer
184+
// Refuse to wrap anything that's null or not an object
185+
if (buffer === null || typeof buffer !== 'object') {
186+
throw(new Error("Cannot wrap null or non-object"));
187+
}
188+
// Wrap ByteBuffer by cloning (preserve offsets)
189+
if (buffer instanceof ByteBuffer) {
190+
return buffer.clone();
191+
}
192+
// Wrap any object that is or contains an ArrayBuffer
185193
if (!!buffer["array"]) {
186194
buffer = buffer["array"];
187195
} else if (!!buffer["buffer"]) {
@@ -1070,7 +1078,9 @@
10701078
var value = 0 >>> 0;
10711079
do {
10721080
b = src.getUint8(offset+count);
1073-
value |= ((b&0x7F)<<(7*count)) >>> 0;
1081+
if (count < ByteBuffer.MAX_VARINT32_BYTES) {
1082+
value |= ((b&0x7F)<<(7*count)) >>> 0;
1083+
}
10741084
++count;
10751085
} while (b & 0x80);
10761086
value = value | 0; // Make sure to discard the higher order bits

tests/suite.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -97,10 +97,11 @@ var suite = {
9797
test.done();
9898
},
9999

100-
"wrap(ByteBuffer)": function(test) {
101-
var bb2 = new ByteBuffer(1);
100+
"wrap(ByteBuffer)": function(test) { // clones
101+
var bb2 = new ByteBuffer(4).writeInt32(0x12345678).flip();
102+
bb2.offset = 1;
102103
var bb = ByteBuffer.wrap(bb2);
103-
test.strictEqual(bb.array, bb2.array);
104+
test.strictEqual(bb2.toHex(), bb.toHex());
104105
test.done();
105106
},
106107

0 commit comments

Comments
 (0)