mirror of
https://github.com/nodejs/node.git
synced 2025-08-15 13:48:44 +02:00
os: fix netmask format check condition in getCIDR function
Modified to check the format of the netmask instead of just checking that each part of the netmask is even PR-URL: https://github.com/nodejs/node/pull/57324 Reviewed-By: Luigi Pinca <luigipinca@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com>
This commit is contained in:
parent
25842c5e35
commit
7102ea1559
3 changed files with 81 additions and 55 deletions
56
lib/os.js
56
lib/os.js
|
@ -24,7 +24,6 @@
|
|||
const {
|
||||
ArrayPrototypePush,
|
||||
Float64Array,
|
||||
NumberParseInt,
|
||||
ObjectDefineProperties,
|
||||
StringPrototypeSlice,
|
||||
SymbolToPrimitive,
|
||||
|
@ -40,6 +39,7 @@ const {
|
|||
},
|
||||
hideStackFrames,
|
||||
} = require('internal/errors');
|
||||
const { getCIDR } = require('internal/util');
|
||||
const { validateInt32 } = require('internal/validators');
|
||||
|
||||
const {
|
||||
|
@ -202,60 +202,6 @@ function endianness() {
|
|||
}
|
||||
endianness[SymbolToPrimitive] = () => kEndianness;
|
||||
|
||||
// Returns the number of ones in the binary representation of the decimal
|
||||
// number.
|
||||
function countBinaryOnes(n) {
|
||||
// Count the number of bits set in parallel, which is faster than looping
|
||||
n = n - ((n >>> 1) & 0x55555555);
|
||||
n = (n & 0x33333333) + ((n >>> 2) & 0x33333333);
|
||||
return ((n + (n >>> 4) & 0xF0F0F0F) * 0x1010101) >>> 24;
|
||||
}
|
||||
|
||||
function getCIDR(address, netmask, family) {
|
||||
let ones = 0;
|
||||
let split = '.';
|
||||
let range = 10;
|
||||
let groupLength = 8;
|
||||
let hasZeros = false;
|
||||
let lastPos = 0;
|
||||
|
||||
if (family === 'IPv6') {
|
||||
split = ':';
|
||||
range = 16;
|
||||
groupLength = 16;
|
||||
}
|
||||
|
||||
for (let i = 0; i < netmask.length; i++) {
|
||||
if (netmask[i] !== split) {
|
||||
if (i + 1 < netmask.length) {
|
||||
continue;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
const part = StringPrototypeSlice(netmask, lastPos, i);
|
||||
lastPos = i + 1;
|
||||
if (part !== '') {
|
||||
if (hasZeros) {
|
||||
if (part !== '0') {
|
||||
return null;
|
||||
}
|
||||
} else {
|
||||
const binary = NumberParseInt(part, range);
|
||||
const binaryOnes = countBinaryOnes(binary);
|
||||
ones += binaryOnes;
|
||||
if (binaryOnes !== groupLength) {
|
||||
if ((binary & 1) !== 0) {
|
||||
return null;
|
||||
}
|
||||
hasZeros = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return `${address}/${ones}`;
|
||||
}
|
||||
|
||||
/**
|
||||
* @returns {Record<string, Array<{
|
||||
* address: string,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue