Skip to content

Commit 310c6a7

Browse files
committed
Use safe-buffer for improved Buffer API
1 parent 7549c73 commit 310c6a7

File tree

13 files changed

+63
-58
lines changed

13 files changed

+63
-58
lines changed

Changes.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ you spot any mistakes.
77
## HEAD
88

99
* Add `sql` property to query `Error` objects #1462 #1628 #1629
10+
* Use `safe-buffer` for improved Buffer API
1011

1112
## v2.13.0 (2017-01-24)
1213

benchmark/parse-100k-blog-rows.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
11
var lib = __dirname + '/../lib';
2+
var Buffer = require('safe-buffer').Buffer;
23
var Protocol = require(lib + '/protocol/protocol');
34
var Packets = require(lib + '/protocol/packets');
45
var PacketWriter = require(lib + '/protocol/PacketWriter');
56
var Parser = require(lib + '/protocol/Parser');
67

7-
var buffers = createBuffers();
88
var options = {
99
rows : 100000,
1010
bufferSize : 64 * 1024
1111
};
1212

13+
var buffers = createBuffers();
14+
1315
console.error('Config:', options);
1416
run();
1517

@@ -63,7 +65,7 @@ function createRowDataPacketBuffer(parser) {
6365
}
6466

6567
function mergeBuffers(buffers) {
66-
var mergeBuffer = new Buffer(options.bufferSize);
68+
var mergeBuffer = Buffer.alloc(options.bufferSize);
6769
var mergeBuffers = [];
6870
var offset = 0;
6971

@@ -78,7 +80,7 @@ function mergeBuffers(buffers) {
7880
buffer.copy(mergeBuffer, offset, 0, bytesRemaining);
7981
mergeBuffers.push(mergeBuffer);
8082

81-
mergeBuffer = new Buffer(options.bufferSize);
83+
mergeBuffer = Buffer.alloc(options.bufferSize);
8284
buffer.copy(mergeBuffer, 0, bytesRemaining);
8385
offset = buffer.length - bytesRemaining;
8486
}

lib/protocol/Auth.js

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
var Buffer = require('buffer').Buffer;
1+
var Buffer = require('safe-buffer').Buffer;
22
var Crypto = require('crypto');
33
var Auth = exports;
44

@@ -10,9 +10,9 @@ function sha1(msg) {
1010
Auth.sha1 = sha1;
1111

1212
function xor(a, b) {
13-
a = new Buffer(a, 'binary');
14-
b = new Buffer(b, 'binary');
15-
var result = new Buffer(a.length);
13+
a = Buffer.from(a, 'binary');
14+
b = Buffer.from(b, 'binary');
15+
var result = Buffer.allocUnsafe(a.length);
1616
for (var i = 0; i < a.length; i++) {
1717
result[i] = (a[i] ^ b[i]);
1818
}
@@ -22,11 +22,11 @@ Auth.xor = xor;
2222

2323
Auth.token = function(password, scramble) {
2424
if (!password) {
25-
return new Buffer(0);
25+
return Buffer.alloc(0);
2626
}
2727

2828
// password must be in binary format, not utf8
29-
var stage1 = sha1((new Buffer(password, 'utf8')).toString('binary'));
29+
var stage1 = sha1((Buffer.from(password, 'utf8')).toString('binary'));
3030
var stage2 = sha1(stage1);
3131
var stage3 = sha1(scramble.toString('binary') + stage2);
3232
return xor(stage3, stage1);
@@ -38,10 +38,10 @@ Auth.hashPassword = function(password) {
3838
var nr = [0x5030, 0x5735],
3939
add = 7,
4040
nr2 = [0x1234, 0x5671],
41-
result = new Buffer(8);
41+
result = Buffer.alloc(8);
4242

4343
if (typeof password === 'string'){
44-
password = new Buffer(password);
44+
password = Buffer.from(password);
4545
}
4646

4747
for (var i = 0; i < password.length; i++) {
@@ -86,7 +86,7 @@ Auth.myRnd = function(r){
8686
};
8787

8888
Auth.scramble323 = function(message, password) {
89-
var to = new Buffer(8),
89+
var to = Buffer.allocUnsafe(8),
9090
hashPass = this.hashPassword(password),
9191
hashMessage = this.hashPassword(message.slice(0, 8)),
9292
seed1 = this.int32Read(hashPass, 0) ^ this.int32Read(hashMessage, 0),

lib/protocol/PacketWriter.js

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ var BUFFER_ALLOC_SIZE = Math.pow(2, 8);
55
// Don't panic: Good enough to represent byte values up to 8192 TB
66
var IEEE_754_BINARY_64_PRECISION = Math.pow(2, 53);
77
var MAX_PACKET_LENGTH = Math.pow(2, 24) - 1;
8+
var Buffer = require('safe-buffer').Buffer;
89

910
module.exports = PacketWriter;
1011
function PacketWriter() {
@@ -14,15 +15,15 @@ function PacketWriter() {
1415

1516
PacketWriter.prototype.toBuffer = function toBuffer(parser) {
1617
if (!this._buffer) {
17-
this._buffer = new Buffer(0);
18+
this._buffer = Buffer.alloc(0);
1819
this._offset = 0;
1920
}
2021

2122
var buffer = this._buffer;
2223
var length = this._offset;
2324
var packets = Math.floor(length / MAX_PACKET_LENGTH) + 1;
2425

25-
this._buffer = new Buffer(length + packets * 4);
26+
this._buffer = Buffer.allocUnsafe(length + packets * 4);
2627
this._offset = 0;
2728

2829
for (var packet = 0; packet < packets; packet++) {
@@ -192,7 +193,7 @@ PacketWriter.prototype.writeLengthCodedString = function(value) {
192193

193194
PacketWriter.prototype._allocate = function _allocate(bytes) {
194195
if (!this._buffer) {
195-
this._buffer = new Buffer(Math.max(BUFFER_ALLOC_SIZE, bytes));
196+
this._buffer = Buffer.alloc(Math.max(BUFFER_ALLOC_SIZE, bytes));
196197
this._offset = 0;
197198
return;
198199
}
@@ -205,6 +206,6 @@ PacketWriter.prototype._allocate = function _allocate(bytes) {
205206
var newSize = this._buffer.length + Math.max(BUFFER_ALLOC_SIZE, bytes);
206207
var oldBuffer = this._buffer;
207208

208-
this._buffer = new Buffer(newSize);
209+
this._buffer = Buffer.alloc(newSize);
209210
oldBuffer.copy(this._buffer);
210211
};

lib/protocol/Parser.js

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,15 @@ var MAX_PACKET_LENGTH = Math.pow(2, 24) - 1;
22
var MUL_32BIT = Math.pow(2, 32);
33
var PacketHeader = require('./PacketHeader');
44
var BigNumber = require('bignumber.js');
5+
var Buffer = require('safe-buffer').Buffer;
56
var BufferList = require('./BufferList');
67

78
module.exports = Parser;
89
function Parser(options) {
910
options = options || {};
1011

1112
this._supportBigNumbers = options.config && options.config.supportBigNumbers;
12-
this._buffer = new Buffer(0);
13+
this._buffer = Buffer.alloc(0);
1314
this._nextBuffers = new BufferList();
1415
this._longPacketBuffers = new BufferList();
1516
this._offset = 0;
@@ -119,7 +120,7 @@ Parser.prototype.append = function append(chunk) {
119120

120121
if (sliceLength !== 0) {
121122
// Create a new Buffer
122-
buffer = new Buffer(sliceLength + length);
123+
buffer = Buffer.allocUnsafe(sliceLength + length);
123124
offset = 0;
124125

125126
// Copy data slice
@@ -131,7 +132,7 @@ Parser.prototype.append = function append(chunk) {
131132
}
132133
} else if (chunks.length > 1) {
133134
// Create a new Buffer
134-
buffer = new Buffer(length);
135+
buffer = Buffer.allocUnsafe(length);
135136
offset = 0;
136137

137138
// Copy chunks
@@ -314,7 +315,7 @@ Parser.prototype.parsePacketTerminatedString = function() {
314315
};
315316

316317
Parser.prototype.parseBuffer = function(length) {
317-
var response = new Buffer(length);
318+
var response = Buffer.alloc(length);
318319
this._buffer.copy(response, 0, this._offset, this._offset + length);
319320

320321
this._offset += length;
@@ -445,7 +446,7 @@ Parser.prototype._combineLongPacketBuffers = function _combineLongPacketBuffers(
445446

446447
// Create buffer
447448
var buf = null;
448-
var buffer = new Buffer(remainingBytes + this._longPacketBuffers.size);
449+
var buffer = Buffer.allocUnsafe(remainingBytes + this._longPacketBuffers.size);
449450
var offset = 0;
450451

451452
// Copy long buffers

lib/protocol/packets/ClientAuthenticationPacket.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
var Buffer = require('safe-buffer').Buffer;
2+
13
module.exports = ClientAuthenticationPacket;
24
function ClientAuthenticationPacket(options) {
35
options = options || {};
@@ -46,7 +48,7 @@ ClientAuthenticationPacket.prototype.write = function(writer) {
4648
writer.writeBuffer(this.scrambleBuff);
4749
if (this.database && this.database.length) {
4850
writer.writeFiller(1);
49-
writer.writeBuffer(new Buffer(this.database));
51+
writer.writeBuffer(Buffer.from(this.database));
5052
}
5153
}
5254
};

lib/protocol/packets/HandshakeInitializationPacket.js

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
var Buffer = require('safe-buffer').Buffer;
12
var Client = require('../constants/client');
23

34
module.exports = HandshakeInitializationPacket;
@@ -88,11 +89,13 @@ HandshakeInitializationPacket.prototype.write = function(writer) {
8889
};
8990

9091
HandshakeInitializationPacket.prototype.scrambleBuff = function() {
91-
var buffer = new Buffer(this.scrambleBuff1.length +
92-
(typeof this.scrambleBuff2 !== 'undefined' ? this.scrambleBuff2.length : 0));
92+
var buffer = null;
9393

94-
this.scrambleBuff1.copy(buffer);
95-
if (typeof this.scrambleBuff2 !== 'undefined') {
94+
if (typeof this.scrambleBuff2 === 'undefined') {
95+
buffer = Buffer.from(this.scrambleBuff1);
96+
} else {
97+
buffer = Buffer.allocUnsafe(this.scrambleBuff1.length + this.scrambleBuff2.length);
98+
this.scrambleBuff1.copy(buffer, 0);
9699
this.scrambleBuff2.copy(buffer, this.scrambleBuff1.length);
97100
}
98101

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
"dependencies": {
1515
"bignumber.js": "3.1.2",
1616
"readable-stream": "1.1.14",
17+
"safe-buffer": "5.0.1",
1718
"sqlstring": "2.2.0"
1819
},
1920
"devDependencies": {

test/FakeServer.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// An experimental fake MySQL server for tricky integration tests. Expanded
22
// as needed.
33

4+
var Buffer = require('safe-buffer').Buffer;
45
var common = require('./common');
56
var Charsets = common.Charsets;
67
var Crypto = require('crypto');
@@ -72,8 +73,8 @@ FakeConnection.prototype.handshake = function(options) {
7273
this._handshakeOptions = options || {};
7374

7475
var packetOpiotns = common.extend({
75-
scrambleBuff1 : new Buffer('1020304050607080', 'hex'),
76-
scrambleBuff2 : new Buffer('0102030405060708090A0B0C', 'hex'),
76+
scrambleBuff1 : Buffer.from('1020304050607080', 'hex'),
77+
scrambleBuff2 : Buffer.from('0102030405060708090A0B0C', 'hex'),
7778
serverCapabilities1 : 512, // only 1 flag, PROTOCOL_41
7879
protocol41 : true
7980
}, this._handshakeOptions);
@@ -269,7 +270,7 @@ FakeConnection.prototype._parsePacket = function(header) {
269270
if (this._handshakeOptions.oldPassword) {
270271
this._sendPacket(new Packets.UseOldPasswordPacket());
271272
} else if (this._handshakeOptions.password === 'passwd') {
272-
var expected = new Buffer('3DA0ADA7C9E1BB3A110575DF53306F9D2DE7FD09', 'hex');
273+
var expected = Buffer.from('3DA0ADA7C9E1BB3A110575DF53306F9D2DE7FD09', 'hex');
273274
this._sendAuthResponse(packet, expected);
274275
} else if (this._handshakeOptions.user || this._handshakeOptions.password) {
275276
throw new Error('not implemented');

test/integration/connection/test-type-casting.js

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
var assert = require('assert');
2+
var Buffer = require('safe-buffer').Buffer;
23
var common = require('../../common');
34

45
var tests = [
@@ -23,13 +24,13 @@ var tests = [
2324
{type: 'datetime', insert: new Date('2012-05-12 12:00:23')},
2425
{type: 'date', insert: new Date('2012-05-12 00:00:00')},
2526
{type: 'time', insert: '13:13:23'},
26-
{type: 'binary(4)', insert: new Buffer([0, 1, 254, 255])},
27-
{type: 'varbinary(4)', insert: new Buffer([0, 1, 254, 255])},
28-
{type: 'tinyblob', insert: new Buffer([0, 1, 254, 255])},
29-
{type: 'mediumblob', insert: new Buffer([0, 1, 254, 255])},
30-
{type: 'longblob', insert: new Buffer([0, 1, 254, 255])},
31-
{type: 'blob', insert: new Buffer([0, 1, 254, 255])},
32-
{type: 'bit(32)', insert: new Buffer([0, 1, 254, 255])},
27+
{type: 'binary(4)', insert: Buffer.from([0, 1, 254, 255])},
28+
{type: 'varbinary(4)', insert: Buffer.from([0, 1, 254, 255])},
29+
{type: 'tinyblob', insert: Buffer.from([0, 1, 254, 255])},
30+
{type: 'mediumblob', insert: Buffer.from([0, 1, 254, 255])},
31+
{type: 'longblob', insert: Buffer.from([0, 1, 254, 255])},
32+
{type: 'blob', insert: Buffer.from([0, 1, 254, 255])},
33+
{type: 'bit(32)', insert: Buffer.from([0, 1, 254, 255])},
3334
{type: 'char(5)', insert: 'Hello'},
3435
{type: 'varchar(5)', insert: 'Hello'},
3536
{type: 'varchar(3) character set utf8 collate utf8_bin', insert: 'bin'},

0 commit comments

Comments
 (0)