From 146d29d713a1e470afecb7488275ac2d89c7be68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?nick8584946899//=E5=A1=AB=E5=86=99=E4=BA=91=E6=95=88?= =?UTF-8?q?=E5=A7=93=E5=90=8D=7E?= Date: Fri, 11 Sep 2026 13:23:34 +0800 Subject: [PATCH] utils: handle zero IPv4 prefix netmask --- .../zstack/utils/network/NetworkUtils.java | 6 +++++- .../utils/test/TestNetworkUtilsEdgeCases.java | 21 +++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 utils/src/test/java/org/zstack/utils/test/TestNetworkUtilsEdgeCases.java diff --git a/utils/src/main/java/org/zstack/utils/network/NetworkUtils.java b/utils/src/main/java/org/zstack/utils/network/NetworkUtils.java index e69be973..9d938a9b 100644 --- a/utils/src/main/java/org/zstack/utils/network/NetworkUtils.java +++ b/utils/src/main/java/org/zstack/utils/network/NetworkUtils.java @@ -814,7 +814,11 @@ public static Integer getPrefixLengthFromNetmask(String mask) { } public static String convertNetmask(Integer prefix) { - int value = 0xffffffff << (32 - prefix); + if (prefix == null || prefix < 0 || prefix > 32) { + throw new IllegalArgumentException("IPv4 prefix length must be between 0 and 32"); + } + + int value = prefix == 0 ? 0 : 0xffffffff << (32 - prefix); byte[] bytes = new byte[]{ (byte) (value >>> 24), (byte) (value >> 16 & 0xff), diff --git a/utils/src/test/java/org/zstack/utils/test/TestNetworkUtilsEdgeCases.java b/utils/src/test/java/org/zstack/utils/test/TestNetworkUtilsEdgeCases.java new file mode 100644 index 00000000..af1ea801 --- /dev/null +++ b/utils/src/test/java/org/zstack/utils/test/TestNetworkUtilsEdgeCases.java @@ -0,0 +1,21 @@ +package org.zstack.utils.test; + +import org.junit.Test; +import org.zstack.utils.network.NetworkUtils; + +import static org.junit.Assert.assertEquals; + +public class TestNetworkUtilsEdgeCases { + @Test + public void testConvertNetmaskBoundaries() { + assertEquals("0.0.0.0", NetworkUtils.convertNetmask(0)); + assertEquals("128.0.0.0", NetworkUtils.convertNetmask(1)); + assertEquals("255.255.255.0", NetworkUtils.convertNetmask(24)); + assertEquals("255.255.255.255", NetworkUtils.convertNetmask(32)); + } + + @Test(expected = IllegalArgumentException.class) + public void testConvertNetmaskRejectsInvalidPrefix() { + NetworkUtils.convertNetmask(33); + } +}