From b9d12b1945cbb52fa52c777d36886fff37e5cf92 Mon Sep 17 00:00:00 2001 From: SEK1RO Date: Mon, 4 Aug 2025 18:43:08 +0300 Subject: [PATCH] fix(ConstTypes): size should be same as in type --- src/ConstArray.js | 3 +++ src/ConstDataView.js | 3 +++ src/ConstString.js | 3 +++ test/ConstArray.test.js | 2 ++ test/ConstDataView.test.js | 2 ++ test/ConstString.test.js | 3 ++- test/Struct.test.js | 4 ++-- 7 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/ConstArray.js b/src/ConstArray.js index 3b5abd6..3008616 100644 --- a/src/ConstArray.js +++ b/src/ConstArray.js @@ -13,6 +13,9 @@ ConstArray.prototype.serialize = function(dv, src, ...inner_types) { if (dv.byteLength < size * item_size) { throw new Error('too small buffer') } + if (src.length != size) { + throw new Error('array should be ' + size + ' elements length') + } for (let i = 0; i < size; i++) { const item_frame = new DataView(dv.buffer, dv.byteOffset + item_size * i) diff --git a/src/ConstDataView.js b/src/ConstDataView.js index 422846d..430b90e 100644 --- a/src/ConstDataView.js +++ b/src/ConstDataView.js @@ -10,6 +10,9 @@ ConstDataView.prototype.serialize = function(dv, src) { if (dv.byteLength < this._size) { throw new Error('too small buffer') } + if (src.byteLength != this._size) { + throw new Error('buffer should be ' + this._size + ' bytes length') + } memcpy(dv, src) return } diff --git a/src/ConstString.js b/src/ConstString.js index fa06447..db9e28c 100644 --- a/src/ConstString.js +++ b/src/ConstString.js @@ -14,6 +14,9 @@ ConstString.prototype.serialize = function(dv, src) { if (dv.byteLength < encoded.byteLength) { throw new Error('too small buffer') } + if (src.length != this._size) { + throw new Error('string should be ' + this._size + ' symbols length') + } memcpy(dv, encoded) return diff --git a/test/ConstArray.test.js b/test/ConstArray.test.js index afbb704..5e6459f 100644 --- a/test/ConstArray.test.js +++ b/test/ConstArray.test.js @@ -14,6 +14,8 @@ describe(ConstArray.name, () => { dv = sizedDataView(sizeof(ConstArray(2), Number)) expect(16).toEqual(dv.byteLength) + expect(() => serialize(dv, [1, 2, 3], ConstArray(2), Number)).toThrow() + serialize(dv, [1, 2], ConstArray(2), Number) expectDataViewEqual(dv, expected) }) diff --git a/test/ConstDataView.test.js b/test/ConstDataView.test.js index ab02b70..cec4e50 100644 --- a/test/ConstDataView.test.js +++ b/test/ConstDataView.test.js @@ -13,6 +13,8 @@ describe(ConstDataView.name, () => { actual = new DataView(buffer, 2, 2) + expect(() => serialize(actual, dv, ConstDataView(1))).toThrow() + serialize(actual, dv, ConstDataView(2)) expectDataViewEqual(new DataView(actual.buffer), expected) }) diff --git a/test/ConstString.test.js b/test/ConstString.test.js index 93385b7..9ca5443 100644 --- a/test/ConstString.test.js +++ b/test/ConstString.test.js @@ -10,7 +10,8 @@ describe(ConstString.name, () => { dv = sizedDataView(5) - serialize(dv, 'hello', ConstString(3)) + expect(() => serialize(dv, 'hello', ConstString(3))).toThrow() + serialize(dv, 'hel', ConstString(3)) expectDataViewEqual(dv, expected) }) diff --git a/test/Struct.test.js b/test/Struct.test.js index 99c6b49..e17f8a2 100644 --- a/test/Struct.test.js +++ b/test/Struct.test.js @@ -80,13 +80,13 @@ describe(Struct.name, () => { const token = { data: { name: 'sek1ro' }, header: { expires: 1 }, - signature: sizedDataView(4), + signature: filledDataView([0xFF, 0xFF, 0xFF, 0xFF]), } const token_dv = filledDataView([ 0x00, 0x00, 0x00, 0x10, // data_head // header 0x3F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // header.expires - 0x00, 0x00, 0x00, 0x00, // signature + 0xFF, 0xFF, 0xFF, 0xFF, // signature // data 0x00, 0x00, 0x00, 0x04, // data.name_head // data.name