]> zoso.dev Git - buffer.git/commitdiff
Fix fromHex invalid hex behavior (#303)
authorJonathan Underwood <jonathan.underwood4649@gmail.com>
Wed, 11 Oct 2023 04:45:05 +0000 (21:45 -0700)
committerGitHub <noreply@github.com>
Wed, 11 Oct 2023 04:45:05 +0000 (15:45 +1100)
Co-authored-by: Daniel Cousens <413395+dcousens@users.noreply.github.com>
AUTHORS.md
index.js
test/node/test-buffer-badhex.js

index 468aa1908c3796cdcad51bdeb239e5840c5d6151..3f4918c7b1ed50cfe571c93fc6c2c20e3e8f4ef4 100644 (file)
@@ -69,5 +69,6 @@
 - jkkang (jkkang@smartauth.kr)
 - Deklan Webster (deklanw@gmail.com)
 - Martin Heidegger (martin.heidegger@gmail.com)
+- junderw (junderwood@bitcoinbank.co.jp)
 
 #### Generated by bin/update-authors.sh.
index 4b441fa054494e38162948f3bc3d91fb2dbb6135..8cb261deaf773bc0741e3e0081bafb5e40ca7e84 100644 (file)
--- a/index.js
+++ b/index.js
@@ -860,9 +860,12 @@ function hexWrite (buf, string, offset, length) {
   }
   let i
   for (i = 0; i < length; ++i) {
-    const parsed = parseInt(string.substr(i * 2, 2), 16)
-    if (numberIsNaN(parsed)) return i
-    buf[offset + i] = parsed
+    const a = hexCharValueTable[string[i * 2]]
+    const b = hexCharValueTable[string[i * 2 + 1]]
+    if (a === undefined || b === undefined) {
+      return i
+    }
+    buf[offset + i] = a << 4 | b
   }
   return i
 }
@@ -2114,6 +2117,32 @@ const hexSliceLookupTable = (function () {
   return table
 })()
 
+// hex lookup table for Buffer.from(x, 'hex')
+const hexCharValueTable = {
+  '0': 0, 
+  '1': 1,
+  '2': 2,
+  '3': 3,
+  '4': 4,
+  '5': 5,
+  '6': 6,
+  '7': 7,
+  '8': 8,
+  '9': 9,
+  a: 10,
+  b: 11,
+  c: 12,
+  d: 13,
+  e: 14,
+  f: 15,
+  A: 10,
+  B: 11,
+  C: 12,
+  D: 13,
+  E: 14,
+  F: 15
+}
+
 // Return not function with Error if BigInt not supported
 function defineBigIntMethod (fn) {
   return typeof BigInt === 'undefined' ? BufferBigIntNotDefined : fn
index a6388e3117fd72a602806556ab8a4c285afe2367..486e166c35a4c138d2152fa3359013c44b8891b7 100644 (file)
@@ -14,6 +14,12 @@ const assert = require('assert');
   assert.strictEqual(buf.write('abcdef01', 0, 'hex'), 4);
   assert.deepStrictEqual(buf, new Buffer([0xab, 0xcd, 0xef, 0x01]));
   assert.strictEqual(buf.toString('hex'), 'abcdef01');
+  // Node Buffer behavior check
+  // > Buffer.from('abc def01','hex')
+  // <Buffer ab>
+  assert.strictEqual(buf.write('abc def01', 0, 'hex'), 1);
+  assert.deepStrictEqual(buf, new Buffer([0xab]));
+  assert.strictEqual(buf.toString('hex'), 'ab');
 
   const copy = Buffer.from(buf.toString('hex'), 'hex');
   assert.strictEqual(buf.toString('hex'), copy.toString('hex'));