8000 Finish parseLengthCodedNumber · mysqljs/mysql@7f74c9d · GitHub
[go: up one dir, main page]

Skip to content

Commit 7f74c9d

Browse files
committed
Finish parseLengthCodedNumber
Add checking and tests for JS precision range being exceeded.
1 parent 80439c5 commit 7f74c9d

File tree

3 files changed

+79
-4
lines changed

3 files changed

+79
-4
lines changed

lib/protocol/PacketWriter.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ PacketWriter.prototype.writeLengthCodedNumber = function(value) {
7777

7878
if (value > IEEE_754_BINARY_64_PRECISION) {
7979
throw new Error(
80-
'LengthCodedBinary.SizeExceeded: JS precision range exceeded, your ' +
80+
'writeLengthCodedNumber: JS precision range exceeded, your ' +
8181
'number is > 53 bit: "' + value + '"'
8282
);
8383
}

lib/protocol/Parser.js

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
var PacketHeader = require('./PacketHeader');
1+
var IEEE_754_BINARY_64_PRECISION = Math.pow(2, 53);
2+
var PacketHeader = require('./PacketHeader');
23

34
module.exports = Parser;
45
function Parser(options) {
@@ -110,10 +111,15 @@ Parser.prototype.parseLengthCodedNumber = function() {
110111
: byte;
111112
}
112113

114+
var length;
113115
if (byte === 252) {
114-
var length = 2;
116+
length = 2;
117+
} else if (byte === 253) {
118+
length = 3;
119+
} else if (byte === 254) {
120+
length = 8;
115121
} else {
116-
thro 8000 w new Error('not implemented');
122+
throw new Error('parseLengthCodedNumber: Unexpected first byte: ' + byte);
117123
}
118124

119125
var value = 0;
@@ -122,6 +128,13 @@ Parser.prototype.parseLengthCodedNumber = function() {
122128
value += Math.pow(256, bytesRead) * byte;
123129
}
124130

131+
if (value >= IEEE_754_BINARY_64_PRECISION) {
132+
throw new Error(
133+
'parseLengthCodedNumber: JS precision range exceeded, ' +
134+
'number is >= 53 bit: "' + value + '"'
135+
);
136+
}
137+
125138
return value;
126139
};
127140

test/unit/protocol/test-Parser.js

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,66 @@ test('Parser', {
2828
assert.equal(parser.parseUnsignedNumber(1), 1);
2929
assert.equal(parser.parseUnsignedNumber(1), 2);
3030
},
31+
32+
'parseLengthCodedNumber: 1 byte': function() {
33+
var parser = packet([250]);
34+
assert.strictEqual(parser.parseLengthCodedNumber(), 250);
35+
},
36+
37+
'parseLengthCodedNumber: 251 = null': function() {
38+
var parser = packet([251]);
39+
assert.strictEqual(parser.parseLengthCodedNumber(), null);
40+
},
41+
42+
'parseLengthCodedNumber: 252 = 16 bit': function() {
43+
var parser = packet([252, 2, 1]);
44+
var expected =
45+
2 * Math.pow(256, 0) +
46+
1 * Math.pow(256, 1);
47+
assert.strictEqual(parser.parseLengthCodedNumber(), expected);
48+
},
49+
50+
'parseLengthCodedNumber: 253 = 24 bit': function() {
51+
var parser = packet([253, 3, 2, 1]);
52+
var expected =
53+
3 * Math.pow(256, 0) +
54+
2 * Math.pow(256, 1) +
55+
1 * Math.pow(256, 2);
56+
57+
assert.strictEqual(parser.parseLengthCodedNumber(), expected);
58+
},
59+
60+
'parseLengthCodedNumber: 254 = 64 bit': function() {
61+
var parser = packet([254, 8, 7, 6, 5, 4, 3, 2, 0]);
62+
var expected =
63+
8 * Math.pow(256, 0) +
64+
7 * Math.pow(256, 1) +
65+
6 * Math.pow(256, 2) +
66+
5 * Math.pow(256, 3) +
67+
4 * Math.pow(256, 4) +
68+
3 * Math.pow(256, 5) +
69+
2 * Math.pow(256, 6) +
70+
0 * Math.pow(256, 7);
71+
72+
assert.strictEqual(parser.parseLengthCodedNumber(), expected);
73+
},
74+
75+
'parseLengthCodedNumber: < 53 bit = no problemo': function() {
76+
var parser = packet([254, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00]);
77+
assert.strictEqual(parser.parseLengthCodedNumber(), Math.pow(2, 53) - 1);
78+
},
79+
80+
'parseLengthCodedNumber: 53 bit = Error': function() {
81+
var parser = packet([254, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00]);
82+
assert.throws(function() {
83+
parser.parseLengthCodedNumber();
84+
}, /precision/i);
85+
},
86+
87+
'parseLengthCodedNumber: 255 = Error': function() {
88+
var parser = packet([255]);
89+
assert.throws(function() {
90+
parser.parseLengthCodedNumber();
91+
}, /unexpected/i);
92+
},
3193
});

0 commit comments

Comments
 (0)
0