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:
Wiyeong Seo 2025-04-20 00:54:48 -05:00 committed by GitHub
parent 25842c5e35
commit 7102ea1559
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 81 additions and 55 deletions

View file

@ -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,