luci-base: fix static proto trace-back when a netmask is set but no IP is set

A trace-back is produced when a netmask is set, and the contents of the IPv4
address field are removed or otherwise unset.

Signed-off-by: Paul Donald <newtwen+github@gmail.com>
This commit is contained in:
Paul Donald
2025-10-30 18:53:14 +01:00
parent 7722292e88
commit 1da88cc888

View File

@@ -8,26 +8,38 @@ function isCIDR(value) {
} }
function calculateBroadcast(s, use_cfgvalue) { function calculateBroadcast(s, use_cfgvalue) {
var readfn = use_cfgvalue ? 'cfgvalue' : 'formvalue', const readfn = use_cfgvalue ? 'cfgvalue' : 'formvalue';
addropt = s.children.filter(function(o) { return o.option == 'ipaddr'})[0], const addropt = s.children.find(o => o.option == 'ipaddr');
addrvals = addropt ? L.toArray(addropt[readfn](s.section)) : [], const addrvals = addropt ? L.toArray(addropt[readfn](s.section)) : [];
maskopt = s.children.filter(function(o) { return o.option == 'netmask'})[0], const maskopt = s.children.find(o => o.option == 'netmask');
maskval = maskopt ? maskopt[readfn](s.section) : null, const maskval = maskopt ? maskopt[readfn](s.section) : null;
firstsubnet = maskval ? addrvals[0] + '/' + maskval : addrvals.filter(function(a) { return a.indexOf('/') > 0 })[0]; let firstsubnet = null;
if (firstsubnet == null) /* only form a subnet if both parts exist */
if (addrvals.length && addrvals[0] && maskval)
firstsubnet = addrvals[0] + '/' + maskval;
else if (addrvals.length)
firstsubnet = addrvals.find(a => a.indexOf('/') > 0);
if (!firstsubnet)
return null; return null;
var addr_mask = firstsubnet.split('/'), const [addr_str, mask_str] = firstsubnet.split('/');
addr = validation.parseIPv4(addr_mask[0]), const addr = validation.parseIPv4(addr_str);
mask = addr_mask[1]; if (!addr)
return null;
let mask = mask_str;
if (!isNaN(mask)) if (!isNaN(mask))
mask = validation.parseIPv4(network.prefixToMask(+mask)); mask = validation.parseIPv4(network.prefixToMask(+mask));
else else
mask = validation.parseIPv4(mask); mask = validation.parseIPv4(mask);
var bc = [ if (!mask)
return null;
const bc = [
addr[0] | (~mask[0] >>> 0 & 255), addr[0] | (~mask[0] >>> 0 & 255),
addr[1] | (~mask[1] >>> 0 & 255), addr[1] | (~mask[1] >>> 0 & 255),
addr[2] | (~mask[2] >>> 0 & 255), addr[2] | (~mask[2] >>> 0 & 255),