From a8759f13905b4ee928b8768a9ba80025e85fcaa8 Mon Sep 17 00:00:00 2001 From: Stefan Thomas Date: Fri, 8 Nov 2013 14:13:54 -0800 Subject: [PATCH] Fix large 32-bit integers getting deserialized as signed ints. --- src/js/ripple/serializedtypes.js | 14 +++++--- test/serializedtypes-test.js | 56 +++++++++++++++++++++++++++++++- 2 files changed, 65 insertions(+), 5 deletions(-) diff --git a/src/js/ripple/serializedtypes.js b/src/js/ripple/serializedtypes.js index 92b8700a..25cf87e7 100644 --- a/src/js/ripple/serializedtypes.js +++ b/src/js/ripple/serializedtypes.js @@ -140,11 +140,17 @@ function append_byte_array(so, val, bytes) { function readAndSum(so, bytes) { var sum = 0; - for (var i=0; i 4) { + throw new Error("This function only supports up to four bytes."); } - return sum; + for (var i=0; i>> 0; }; var STInt8 = exports.Int8 = new SerializedType({ @@ -171,7 +177,7 @@ STInt16.id = 1; var STInt32 = exports.Int32 = new SerializedType({ serialize: function (so, val) { - append_byte_array(so, val, 4) + append_byte_array(so, val, 4); }, parse: function (so) { return readAndSum(so, 4); diff --git a/test/serializedtypes-test.js b/test/serializedtypes-test.js index a4473a99..ac2a253b 100644 --- a/test/serializedtypes-test.js +++ b/test/serializedtypes-test.js @@ -204,6 +204,24 @@ describe('Serialized types', function() { types.Int32.serialize(so, {}); }); }); + it('Parse 0', function () { + var val = '00000000'; + var so = new SerializedObject(val); + var num = types.Int32.parse(so); + assert.strictEqual(num, parseInt(val, 16)); + }); + it('Parse 1', function () { + var val = '00000001'; + var so = new SerializedObject(val); + var num = types.Int32.parse(so); + assert.strictEqual(num, parseInt(val, 16)); + }); + it('Parse UINT32_MAX', function () { + var val = 'FFFFFFFF'; + var so = new SerializedObject(val); + var num = types.Int32.parse(so); + assert.strictEqual(num, parseInt(val, 16)); + }); }); describe('Int64', function() { @@ -333,11 +351,29 @@ describe('Serialized types', function() { types.Hash128.serialize(so, '102030405060708090A0B0C0D0E0F000'); assert.strictEqual(so.to_hex(), '102030405060708090A0B0C0D0E0F000'); }); - it('Serialize FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF', function () { + it('Serialize HASH128_MAX', function () { var so = new SerializedObject(); types.Hash128.serialize(so, 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF'); assert.strictEqual(so.to_hex(), 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF'); }); + it('Parse 0', function () { + var val = '00000000000000000000000000000000'; + var so = new SerializedObject(val); + var num = types.Hash128.parse(so); + assert.strictEqual(num.to_hex(), val); + }); + it('Parse 1', function () { + var val = '00000000000000000000000000000001'; + var so = new SerializedObject(val); + var num = types.Hash128.parse(so); + assert.strictEqual(num.to_hex(), val); + }); + it('Parse HASH128_MAX', function () { + var val = 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF'; + var so = new SerializedObject(val); + var num = types.Hash128.parse(so); + assert.strictEqual(num.to_hex(), val); + }); }); describe('Hash160', function() { @@ -356,6 +392,24 @@ describe('Serialized types', function() { types.Hash160.serialize(so, 'rQLbzfJH5BT1FS9apRLKV3G8dWEA5njaQi'); assert.strictEqual(so.to_hex(), 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF'); }); + it('Parse 0', function () { + var val = '0000000000000000000000000000000000000000'; + var so = new SerializedObject(val); + var num = types.Hash160.parse(so); + assert.strictEqual(num.to_hex(), val); + }); + it('Parse 1', function () { + var val = '0000000000000000000000000000000000000001'; + var so = new SerializedObject(val); + var num = types.Hash160.parse(so); + assert.strictEqual(num.to_hex(), val); + }); + it('Parse HASH160_MAX', function () { + var val = 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF'; + var so = new SerializedObject(val); + var num = types.Hash160.parse(so); + assert.strictEqual(num.to_hex(), val); + }); }); describe('Hash256', function() {