Skip to content

Commit 5658422

Browse files
committed
Fix edge cases writing certain length coded values
1 parent 1d76b68 commit 5658422

File tree

3 files changed

+94
-4
lines changed

3 files changed

+94
-4
lines changed

Changes.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ you spot any mistakes.
1010
* Add `query` method to `PoolNamespace` #1256 #1505 #1506
1111
- Used as `cluster.of(...).query(...)`
1212
* Add new error codes up to MySQL 5.7.16
13+
* Fix edge cases writing certain length coded values
1314
* Fix typo in `HANDSHAKE_NO_SSL_SUPPORT` error message #1534
1415
* Support Node.js 7.x
1516
* Update `bignumber.js` to 2.4.0

lib/protocol/PacketWriter.js

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -116,10 +116,10 @@ PacketWriter.prototype.writeLengthCodedNumber = function(value) {
116116
);
117117
}
118118

119-
if (value <= BIT_16) {
119+
if (value < BIT_16) {
120120
this._allocate(3);
121121
this._buffer[this._offset++] = 252;
122-
} else if (value <= BIT_24) {
122+
} else if (value < BIT_24) {
123123
this._allocate(4);
124124
this._buffer[this._offset++] = 253;
125125
} else {
@@ -131,12 +131,16 @@ PacketWriter.prototype.writeLengthCodedNumber = function(value) {
131131
this._buffer[this._offset++] = value & 0xff;
132132
this._buffer[this._offset++] = (value >> 8) & 0xff;
133133

134-
if (value <= BIT_16) return;
134+
if (value < BIT_16) {
135+
return;
136+
}
135137

136138
// 24 Bit
137139
this._buffer[this._offset++] = (value >> 16) & 0xff;
138140

139-
if (value <= BIT_24) return;
141+
if (value < BIT_24) {
142+
return;
143+
}
140144

141145
this._buffer[this._offset++] = (value >> 24) & 0xff;
142146

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
var assert = require('assert');
2+
var common = require('../../common');
3+
var connection = common.createConnection({port: common.fakeServerPort});
4+
var server = common.createFakeServer();
5+
6+
server.listen(common.fakeServerPort, function (err) {
7+
assert.ifError(err);
8+
9+
connection.query('SELECT value FROM blobs', function (err, rows) {
10+
assert.ifError(err);
11+
assert.equal(rows.length, 6);
12+
assert.equal(rows[0].value.length, 0);
13+
assert.equal(rows[1].value.length, 8);
14+
assert.equal(rows[2].value.length, (Math.pow(2, 16) - 1));
15+
assert.equal(rows[3].value.length, Math.pow(2, 16));
16+
assert.equal(rows[4].value.length, (Math.pow(2, 24) - 1));
17+
assert.equal(rows[5].value.length, Math.pow(2, 24));
18+
19+
connection.destroy();
20+
server.destroy();
21+
});
22+
});
23+
24+
server.on('connection', function(conn) {
25+
conn.handshake();
26+
conn.on('query', function(packet) {
27+
switch (packet.sql) {
28+
case 'SELECT value FROM blobs':
29+
this._sendPacket(new common.Packets.ResultSetHeaderPacket({
30+
fieldCount: 1
31+
}));
32+
33+
this._sendPacket(new common.Packets.FieldPacket({
34+
catalog : 'def',
35+
charsetNr : common.Charsets.BINARY,
36+
name : 'value',
37+
protocol41 : true,
38+
type : common.Types.LONG_BLOB
39+
}));
40+
41+
this._sendPacket(new common.Packets.EofPacket());
42+
43+
var writer = new common.PacketWriter();
44+
writer.writeLengthCodedBuffer(new Buffer(0));
45+
this._socket.write(writer.toBuffer(this._parser));
46+
47+
var writer = new common.PacketWriter();
48+
writer.writeLengthCodedBuffer(filledBuffer(8, '.'));
49+
this._socket.write(writer.toBuffer(this._parser));
50+
51+
var writer = new common.PacketWriter();
52+
writer.writeLengthCodedBuffer(filledBuffer((Math.pow(2, 16) - 1), '.'));
53+
this._socket.write(writer.toBuffer(this._parser));
54+
55+
var writer = new common.PacketWriter();
56+
writer.writeLengthCodedBuffer(filledBuffer(Math.pow(2, 16), '.'));
57+
this._socket.write(writer.toBuffer(this._parser));
58+
59+
var writer = new common.PacketWriter();
60+
writer.writeLengthCodedBuffer(filledBuffer((Math.pow(2, 24) - 1), '.'));
61+
this._socket.write(writer.toBuffer(this._parser));
62+
63+
var writer = new common.PacketWriter();
64+
writer.writeLengthCodedBuffer(filledBuffer(Math.pow(2, 24), '.'));
65+
this._socket.write(writer.toBuffer(this._parser));
66+
67+
this._sendPacket(new common.Packets.EofPacket());
68+
this._parser.resetPacketNumber();
69+
break;
70+
default:
71+
this._handlePacketQuery(packet);
72+
break;
73+
}
74+
});
75+
});
76+
77+
function filledBuffer(size, fill) {
78+
if (Buffer.alloc) {
79+
return Buffer.alloc(size, fill);
80+
}
81+
82+
var buf = new Buffer(size);
83+
buf.fill(fill);
84+
return buf;
85+
}

0 commit comments

Comments
 (0)