Skip to content

Commit 7a23fc0

Browse files
committedJan 24, 2018
buffer: coerce offset to integer
The offset was formerly coerced to a integer and this reimplements that. PR-URL: #18215 Fixes: #18208 Reviewed-By: Anna Henningsen <[email protected]> Reviewed-By: Ben Noordhuis <[email protected]> Reviewed-By: Richard Lau <[email protected]> Reviewed-By: Colin Ihrig <[email protected]> Reviewed-By: Tobias Nießen <[email protected]>
1 parent 373e893 commit 7a23fc0

File tree

2 files changed

+102
-99
lines changed

2 files changed

+102
-99
lines changed
 

‎lib/buffer.js

+4
Original file line numberDiff line numberDiff line change
@@ -1272,25 +1272,29 @@ function toFloat(x) {
12721272

12731273

12741274
Buffer.prototype.readDoubleBE = function(offset, noAssert) {
1275+
offset = offset >>> 0;
12751276
const x1 = this.readUInt32BE(offset + 0, noAssert);
12761277
const x0 = this.readUInt32BE(offset + 4, noAssert);
12771278
return toDouble(x0, x1);
12781279
};
12791280

12801281

12811282
Buffer.prototype.readDoubleLE = function(offset, noAssert) {
1283+
offset = offset >>> 0;
12821284
const x0 = this.readUInt32LE(offset + 0, noAssert);
12831285
const x1 = this.readUInt32LE(offset + 4, noAssert);
12841286
return toDouble(x0, x1);
12851287
};
12861288

12871289

12881290
Buffer.prototype.readFloatBE = function(offset, noAssert) {
1291+
offset = offset >>> 0;
12891292
return toFloat(this.readUInt32BE(offset, noAssert));
12901293
};
12911294

12921295

12931296
Buffer.prototype.readFloatLE = function(offset, noAssert) {
1297+
offset = offset >>> 0;
12941298
return toFloat(this.readUInt32LE(offset, noAssert));
12951299
};
12961300

‎test/parallel/test-readdouble.js

+98-99
Original file line numberDiff line numberDiff line change
@@ -29,102 +29,101 @@ const assert = require('assert');
2929
/*
3030
* Test (64 bit) double
3131
*/
32-
function test(clazz) {
33-
const buffer = new clazz(8);
34-
35-
buffer[0] = 0x55;
36-
buffer[1] = 0x55;
37-
buffer[2] = 0x55;
38-
buffer[3] = 0x55;
39-
buffer[4] = 0x55;
40-
buffer[5] = 0x55;
41-
buffer[6] = 0xd5;
42-
buffer[7] = 0x3f;
43-
assert.strictEqual(1.1945305291680097e+103, buffer.readDoubleBE(0));
44-
assert.strictEqual(0.3333333333333333, buffer.readDoubleLE(0));
45-
46-
buffer[0] = 1;
47-
buffer[1] = 0;
48-
buffer[2] = 0;
49-
buffer[3] = 0;
50-
buffer[4] = 0;
51-
buffer[5] = 0;
52-
buffer[6] = 0xf0;
53-
buffer[7] = 0x3f;
54-
assert.strictEqual(7.291122019655968e-304, buffer.readDoubleBE(0));
55-
assert.strictEqual(1.0000000000000002, buffer.readDoubleLE(0));
56-
57-
buffer[0] = 2;
58-
assert.strictEqual(4.778309726801735e-299, buffer.readDoubleBE(0));
59-
assert.strictEqual(1.0000000000000004, buffer.readDoubleLE(0));
60-
61-
buffer[0] = 1;
62-
buffer[6] = 0;
63-
buffer[7] = 0;
64-
assert.strictEqual(7.291122019556398e-304, buffer.readDoubleBE(0));
65-
assert.strictEqual(5e-324, buffer.readDoubleLE(0));
66-
67-
buffer[0] = 0xff;
68-
buffer[1] = 0xff;
69-
buffer[2] = 0xff;
70-
buffer[3] = 0xff;
71-
buffer[4] = 0xff;
72-
buffer[5] = 0xff;
73-
buffer[6] = 0x0f;
74-
buffer[7] = 0x00;
75-
assert.ok(Number.isNaN(buffer.readDoubleBE(0)));
76-
assert.strictEqual(2.225073858507201e-308, buffer.readDoubleLE(0));
77-
78-
buffer[6] = 0xef;
79-
buffer[7] = 0x7f;
80-
assert.ok(Number.isNaN(buffer.readDoubleBE(0)));
81-
assert.strictEqual(1.7976931348623157e+308, buffer.readDoubleLE(0));
82-
83-
buffer[0] = 0;
84-
buffer[1] = 0;
85-
buffer[2] = 0;
86-
buffer[3] = 0;
87-
buffer[4] = 0;
88-
buffer[5] = 0;
89-
buffer[6] = 0xf0;
90-
buffer[7] = 0x3f;
91-
assert.strictEqual(3.03865e-319, buffer.readDoubleBE(0));
92-
assert.strictEqual(1, buffer.readDoubleLE(0));
93-
94-
buffer[6] = 0;
95-
buffer[7] = 0x40;
96-
assert.strictEqual(3.16e-322, buffer.readDoubleBE(0));
97-
assert.strictEqual(2, buffer.readDoubleLE(0));
98-
99-
buffer[7] = 0xc0;
100-
assert.strictEqual(9.5e-322, buffer.readDoubleBE(0));
101-
assert.strictEqual(-2, buffer.readDoubleLE(0));
102-
103-
buffer[6] = 0x10;
104-
buffer[7] = 0;
105-
assert.strictEqual(2.0237e-320, buffer.readDoubleBE(0));
106-
assert.strictEqual(2.2250738585072014e-308, buffer.readDoubleLE(0));
107-
108-
buffer[6] = 0;
109-
assert.strictEqual(0, buffer.readDoubleBE(0));
110-
assert.strictEqual(0, buffer.readDoubleLE(0));
111-
assert.strictEqual(false, 1 / buffer.readDoubleLE(0) < 0);
112-
113-
buffer[7] = 0x80;
114-
assert.strictEqual(6.3e-322, buffer.readDoubleBE(0));
115-
assert.strictEqual(-0, buffer.readDoubleLE(0));
116-
assert.strictEqual(true, 1 / buffer.readDoubleLE(0) < 0);
117-
118-
buffer[6] = 0xf0;
119-
buffer[7] = 0x7f;
120-
assert.strictEqual(3.0418e-319, buffer.readDoubleBE(0));
121-
assert.strictEqual(Infinity, buffer.readDoubleLE(0));
122-
123-
buffer[6] = 0xf0;
124-
buffer[7] = 0xff;
125-
assert.strictEqual(3.04814e-319, buffer.readDoubleBE(0));
126-
assert.strictEqual(-Infinity, buffer.readDoubleLE(0));
127-
}
128-
129-
130-
test(Buffer);
32+
const buffer = Buffer.allocUnsafe(8);
33+
34+
buffer[0] = 0x55;
35+
buffer[1] = 0x55;
36+
buffer[2] = 0x55;
37+
buffer[3] = 0x55;
38+
buffer[4] = 0x55;
39+
buffer[5] = 0x55;
40+
buffer[6] = 0xd5;
41+
buffer[7] = 0x3f;
42+
assert.strictEqual(1.1945305291680097e+103, buffer.readDoubleBE(0));
43+
assert.strictEqual(0.3333333333333333, buffer.readDoubleLE(0));
44+
45+
buffer[0] = 1;
46+
buffer[1] = 0;
47+
buffer[2] = 0;
48+
buffer[3] = 0;
49+
buffer[4] = 0;
50+
buffer[5] = 0;
51+
buffer[6] = 0xf0;
52+
buffer[7] = 0x3f;
53+
assert.strictEqual(7.291122019655968e-304, buffer.readDoubleBE(0));
54+
assert.strictEqual(1.0000000000000002, buffer.readDoubleLE(0));
55+
56+
buffer[0] = 2;
57+
assert.strictEqual(4.778309726801735e-299, buffer.readDoubleBE(0));
58+
assert.strictEqual(1.0000000000000004, buffer.readDoubleLE(0));
59+
60+
buffer[0] = 1;
61+
buffer[6] = 0;
62+
buffer[7] = 0;
63+
assert.strictEqual(7.291122019556398e-304, buffer.readDoubleBE(0));
64+
assert.strictEqual(5e-324, buffer.readDoubleLE(0));
65+
66+
buffer[0] = 0xff;
67+
buffer[1] = 0xff;
68+
buffer[2] = 0xff;
69+
buffer[3] = 0xff;
70+
buffer[4] = 0xff;
71+
buffer[5] = 0xff;
72+
buffer[6] = 0x0f;
73+
buffer[7] = 0x00;
74+
assert.ok(Number.isNaN(buffer.readDoubleBE(0)));
75+
assert.strictEqual(2.225073858507201e-308, buffer.readDoubleLE(0));
76+
77+
buffer[6] = 0xef;
78+
buffer[7] = 0x7f;
79+
assert.ok(Number.isNaN(buffer.readDoubleBE(0)));
80+
assert.strictEqual(1.7976931348623157e+308, buffer.readDoubleLE(0));
81+
82+
buffer[0] = 0;
83+
buffer[1] = 0;
84+
buffer[2] = 0;
85+
buffer[3] = 0;
86+
buffer[4] = 0;
87+
buffer[5] = 0;
88+
buffer[6] = 0xf0;
89+
buffer[7] = 0x3f;
90+
assert.strictEqual(3.03865e-319, buffer.readDoubleBE(0));
91+
assert.strictEqual(1, buffer.readDoubleLE(0));
92+
93+
buffer[6] = 0;
94+
buffer[7] = 0x40;
95+
assert.strictEqual(3.16e-322, buffer.readDoubleBE(0));
96+
assert.strictEqual(2, buffer.readDoubleLE(0));
97+
98+
buffer[7] = 0xc0;
99+
assert.strictEqual(9.5e-322, buffer.readDoubleBE(0));
100+
assert.strictEqual(-2, buffer.readDoubleLE(0));
101+
102+
buffer[6] = 0x10;
103+
buffer[7] = 0;
104+
assert.strictEqual(2.0237e-320, buffer.readDoubleBE(0));
105+
assert.strictEqual(2.2250738585072014e-308, buffer.readDoubleLE(0));
106+
107+
buffer[6] = 0;
108+
assert.strictEqual(0, buffer.readDoubleBE(0));
109+
assert.strictEqual(0, buffer.readDoubleLE(0));
110+
assert.strictEqual(false, 1 / buffer.readDoubleLE(0) < 0);
111+
112+
buffer[7] = 0x80;
113+
assert.strictEqual(6.3e-322, buffer.readDoubleBE(0));
114+
assert.strictEqual(-0, buffer.readDoubleLE(0));
115+
assert.strictEqual(true, 1 / buffer.readDoubleLE(0) < 0);
116+
117+
buffer[6] = 0xf0;
118+
buffer[7] = 0x7f;
119+
assert.strictEqual(3.0418e-319, buffer.readDoubleBE(0));
120+
assert.strictEqual(Infinity, buffer.readDoubleLE(0));
121+
122+
buffer[7] = 0xff;
123+
assert.strictEqual(3.04814e-319, buffer.readDoubleBE(0));
124+
assert.strictEqual(-Infinity, buffer.readDoubleLE(0));
125+
126+
buffer.writeDoubleBE(246800);
127+
assert.strictEqual(buffer.readDoubleBE(), 246800);
128+
assert.strictEqual(buffer.readDoubleBE(0.7), 246800);
129+
assert.strictEqual(buffer.readDoubleBE(NaN), 246800);

0 commit comments

Comments
 (0)
Please sign in to comment.