hd: better path parsing.
This commit is contained in:
parent
60b345f59c
commit
e6cd60f919
@ -52,32 +52,39 @@ common.cache = new LRU(500);
|
|||||||
common.parsePath = function parsePath(path, hard) {
|
common.parsePath = function parsePath(path, hard) {
|
||||||
assert(typeof path === 'string');
|
assert(typeof path === 'string');
|
||||||
assert(typeof hard === 'boolean');
|
assert(typeof hard === 'boolean');
|
||||||
|
assert(path.length >= 1);
|
||||||
|
assert(path.length <= 3062);
|
||||||
|
|
||||||
const parts = path.split('/');
|
const parts = path.split('/');
|
||||||
const root = parts.shift();
|
const root = parts[0];
|
||||||
|
|
||||||
if (root !== 'm'
|
if (root !== 'm'
|
||||||
&& root !== 'M'
|
&& root !== 'M'
|
||||||
&& root !== 'm\''
|
&& root !== 'm\''
|
||||||
&& root !== 'M\'') {
|
&& root !== 'M\'') {
|
||||||
throw new Error('Bad path root.');
|
throw new Error('Invalid path root.');
|
||||||
}
|
}
|
||||||
|
|
||||||
const result = [];
|
const result = [];
|
||||||
|
|
||||||
for (let part of parts) {
|
for (let i = 1; i < parts.length; i++) {
|
||||||
|
let part = parts[i];
|
||||||
|
|
||||||
const hardened = part[part.length - 1] === '\'';
|
const hardened = part[part.length - 1] === '\'';
|
||||||
|
|
||||||
if (hardened)
|
if (hardened)
|
||||||
part = part.slice(0, -1);
|
part = part.slice(0, -1);
|
||||||
|
|
||||||
|
if (part.length > 10)
|
||||||
|
throw new Error('Path index too large.');
|
||||||
|
|
||||||
if (!/^\d+$/.test(part))
|
if (!/^\d+$/.test(part))
|
||||||
throw new Error('Non-number path index.');
|
throw new Error('Path index is non-numeric.');
|
||||||
|
|
||||||
let index = parseInt(part, 10);
|
let index = parseInt(part, 10);
|
||||||
|
|
||||||
if ((index >>> 0) !== index)
|
if ((index >>> 0) !== index)
|
||||||
throw new Error('Index out of range.');
|
throw new Error('Path index out of range.');
|
||||||
|
|
||||||
if (hardened) {
|
if (hardened) {
|
||||||
index |= common.HARDENED;
|
index |= common.HARDENED;
|
||||||
@ -85,7 +92,7 @@ common.parsePath = function parsePath(path, hard) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!hard && (index & common.HARDENED))
|
if (!hard && (index & common.HARDENED))
|
||||||
throw new Error('Cannot derive hardened.');
|
throw new Error('Path index cannot be hardened.');
|
||||||
|
|
||||||
result.push(index);
|
result.push(index);
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user