Skip to content

Commit fcff531

Browse files
mvollrathjihoonl
authored andcommitted
Fix CBOR native array decoding offset (RobotWebTools#318)
Use correct offset and length when slicing the message buffer. Add a test to reveal the breakage.
1 parent 165912f commit fcff531

File tree

2 files changed

+20
-3
lines changed

2 files changed

+20
-3
lines changed

src/util/cborTypedArrayTags.js

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,10 @@ function decodeUint64LE(bytes) {
1818
warnPrecision();
1919

2020
var byteLen = bytes.byteLength;
21+
var offset = bytes.byteOffset;
2122
var arrLen = byteLen / 8;
2223

23-
var buffer = bytes.buffer.slice(-byteLen);
24+
var buffer = bytes.buffer.slice(offset, offset + byteLen);
2425
var uint32View = new Uint32Array(buffer);
2526

2627
var arr = new Array(arrLen);
@@ -42,9 +43,10 @@ function decodeInt64LE(bytes) {
4243
warnPrecision();
4344

4445
var byteLen = bytes.byteLength;
46+
var offset = bytes.byteOffset;
4547
var arrLen = byteLen / 8;
4648

47-
var buffer = bytes.buffer.slice(-byteLen);
49+
var buffer = bytes.buffer.slice(offset, offset + byteLen);
4850
var uint32View = new Uint32Array(buffer);
4951
var int32View = new Int32Array(buffer);
5052

@@ -66,7 +68,8 @@ function decodeInt64LE(bytes) {
6668
*/
6769
function decodeNativeArray(bytes, ArrayType) {
6870
var byteLen = bytes.byteLength;
69-
var buffer = bytes.buffer.slice(-byteLen);
71+
var offset = bytes.byteOffset;
72+
var buffer = bytes.buffer.slice(offset, offset + byteLen);
7073
return new ArrayType(buffer);
7174
}
7275

test/cbor.test.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,4 +112,18 @@ describe('CBOR Typed Array Tagger', function() {
112112
expect(msg[1]).to.be.closeTo(-2.2, 1e-5);
113113
expect(msg[2]).to.be.closeTo(3.3, 1e-5);
114114
});
115+
116+
it('should be able to unpack two typed arrays', function() {
117+
var data = hexToBuffer('82d8484308fe05d84d460100feff0300');
118+
var msg = CBOR.decode(data, cborTypedArrayTagger);
119+
120+
expect(msg).to.be.a('Array');
121+
expect(msg).to.have.lengthOf(2);
122+
expect(msg[0][0]).to.equal(8);
123+
expect(msg[0][1]).to.equal(-2);
124+
expect(msg[0][2]).to.equal(5);
125+
expect(msg[1][0]).to.equal(1);
126+
expect(msg[1][1]).to.equal(-2);
127+
expect(msg[1][2]).to.equal(3);
128+
});
115129
});

0 commit comments

Comments
 (0)