From d742d476e05f4068a3055d3eca5131c19c10386e Mon Sep 17 00:00:00 2001 From: Mikhail Puzanov Date: Mon, 21 Sep 2026 18:07:47 +0200 Subject: [PATCH 1/6] Fix Asn construction from BigInteger --- src/main/java/net/ripe/ipresource/Asn.java | 10 ++++++++-- src/test/java/net/ripe/ipresource/AsnTest.java | 9 +++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/ripe/ipresource/Asn.java b/src/main/java/net/ripe/ipresource/Asn.java index fa780fa..1900a99 100644 --- a/src/main/java/net/ripe/ipresource/Asn.java +++ b/src/main/java/net/ripe/ipresource/Asn.java @@ -54,8 +54,8 @@ public class Asn extends UniqueIpResource { // unsigned long value. private int intValue; - public Asn(BigInteger value) { - this(value.longValue()); + public Asn(BigInteger value) { + this(checked(value)); } public Asn(long value) { @@ -148,6 +148,12 @@ public final BigInteger getValue() { return BigInteger.valueOf(longValue()); } + private static long checked(BigInteger value) { + Validate.isTrue(value.compareTo(BigInteger.valueOf(ASN32_MAX_VALUE)) <= 0); + Validate.isTrue(value.compareTo(BigInteger.valueOf(ASN_MIN_VALUE)) >= 0); + return value.longValue(); + } + @Override protected boolean adjacent(UniqueIpResource other) { return other instanceof Asn && Math.abs(longValue() - ((Asn) other).longValue()) == 1; diff --git a/src/test/java/net/ripe/ipresource/AsnTest.java b/src/test/java/net/ripe/ipresource/AsnTest.java index be180ae..0f307f8 100644 --- a/src/test/java/net/ripe/ipresource/AsnTest.java +++ b/src/test/java/net/ripe/ipresource/AsnTest.java @@ -31,6 +31,8 @@ import static org.junit.Assert.*; +import java.math.BigInteger; + import org.junit.Test; /** @@ -80,6 +82,13 @@ public void shouldFailOnIllegalValue() { Asn.parse("AS232442321412"); } + @Test(expected = IllegalArgumentException.class) + public void shouldFailOnWraparoundBigInteger() { + // BigInteger.longValue() keeps only the low 64 bits, so converting this value with longValue() + // would wrap around to 5, which is in range. Asn(BigInteger) must reject it regardless. + new Asn(BigInteger.ONE.shiftLeft(64).add(BigInteger.valueOf(5))); + } + @Test public void shouldParseDotNotatedAsNumber() { assertEquals(new Asn(65536), Asn.parse("AS1.0")); From 2bec1fe465352785889d4747ffa0679395ed506a Mon Sep 17 00:00:00 2001 From: Mikhail Puzanov Date: Tue, 22 Sep 2026 16:07:21 +0200 Subject: [PATCH 2/6] SImplify, add one more test --- src/main/java/net/ripe/ipresource/Asn.java | 2 +- src/test/java/net/ripe/ipresource/AsnTest.java | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/ripe/ipresource/Asn.java b/src/main/java/net/ripe/ipresource/Asn.java index 1900a99..8316fbf 100644 --- a/src/main/java/net/ripe/ipresource/Asn.java +++ b/src/main/java/net/ripe/ipresource/Asn.java @@ -55,7 +55,7 @@ public class Asn extends UniqueIpResource { private int intValue; public Asn(BigInteger value) { - this(checked(value)); + this(value.longValueExact()); } public Asn(long value) { diff --git a/src/test/java/net/ripe/ipresource/AsnTest.java b/src/test/java/net/ripe/ipresource/AsnTest.java index 0f307f8..7b5ef56 100644 --- a/src/test/java/net/ripe/ipresource/AsnTest.java +++ b/src/test/java/net/ripe/ipresource/AsnTest.java @@ -83,6 +83,11 @@ public void shouldFailOnIllegalValue() { } @Test(expected = IllegalArgumentException.class) + public void shouldFailOnVeryBigLong() { + new Asn(1 << 63L); + } + + @Test(expected = ArithmeticException.class) public void shouldFailOnWraparoundBigInteger() { // BigInteger.longValue() keeps only the low 64 bits, so converting this value with longValue() // would wrap around to 5, which is in range. Asn(BigInteger) must reject it regardless. From 115220b0c13381aabd4c1166b9d970be54d317e2 Mon Sep 17 00:00:00 2001 From: Mikhail Puzanov Date: Tue, 22 Sep 2026 16:10:15 +0200 Subject: [PATCH 3/6] Remove unused checked --- src/main/java/net/ripe/ipresource/Asn.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/main/java/net/ripe/ipresource/Asn.java b/src/main/java/net/ripe/ipresource/Asn.java index 8316fbf..3d39fd0 100644 --- a/src/main/java/net/ripe/ipresource/Asn.java +++ b/src/main/java/net/ripe/ipresource/Asn.java @@ -148,12 +148,6 @@ public final BigInteger getValue() { return BigInteger.valueOf(longValue()); } - private static long checked(BigInteger value) { - Validate.isTrue(value.compareTo(BigInteger.valueOf(ASN32_MAX_VALUE)) <= 0); - Validate.isTrue(value.compareTo(BigInteger.valueOf(ASN_MIN_VALUE)) >= 0); - return value.longValue(); - } - @Override protected boolean adjacent(UniqueIpResource other) { return other instanceof Asn && Math.abs(longValue() - ((Asn) other).longValue()) == 1; From 1fda706d3023b7705059dee8a31bb4dc1a267edc Mon Sep 17 00:00:00 2001 From: Mikhail Puzanov Date: Wed, 23 Sep 2026 15:36:14 +0200 Subject: [PATCH 4/6] Add some test to the validation exception --- src/main/java/net/ripe/ipresource/IpRange.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/ripe/ipresource/IpRange.java b/src/main/java/net/ripe/ipresource/IpRange.java index 3c3387c..54e0d8e 100644 --- a/src/main/java/net/ripe/ipresource/IpRange.java +++ b/src/main/java/net/ripe/ipresource/IpRange.java @@ -48,8 +48,9 @@ public static IpRange range(IpAddress start, IpAddress end) { public static IpRange prefix(IpAddress networkNumber, int prefixLength) { Validate.notNull(networkNumber, "network number not null"); - Validate.isTrue(prefixLength >= 0); - Validate.isTrue(prefixLength <= networkNumber.getType().getBitSize()); + Validate.isTrue(prefixLength >= 0, "prefix length must be non-negative"); + Validate.isTrue(prefixLength <= networkNumber.getType().getBitSize(), + "prefix " + prefixLength + " out of bounds (maximum " + networkNumber.getType().getBitSize() + ")"); return new IpRange(networkNumber, prefixLength); } From 407defa9eee8ed8e34fecddb19b8575552dde306 Mon Sep 17 00:00:00 2001 From: Mikhail Puzanov Date: Wed, 23 Sep 2026 15:37:20 +0200 Subject: [PATCH 5/6] More tests --- src/test/java/net/ripe/ipresource/IpRangeTest.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/test/java/net/ripe/ipresource/IpRangeTest.java b/src/test/java/net/ripe/ipresource/IpRangeTest.java index 6f6c90c..be9fee8 100644 --- a/src/test/java/net/ripe/ipresource/IpRangeTest.java +++ b/src/test/java/net/ripe/ipresource/IpRangeTest.java @@ -131,4 +131,9 @@ public void shouldCheckPrefixLength_NonNegative() { public void shouldCheckPrefixLength_NotGreatherThanAddressBitSize() { IpRange.prefix(IpAddress.parse("127.0.0.0"), 34); } + + @Test(expected = IllegalArgumentException.class) + public void shouldCheckPrefixLength_NotGreatherThanAddressBitSize_v6() { + IpRange.prefix(IpAddress.parse("2001:67c:2e8:13:21e:c2ff:0:0"), 129); + } } From 5cb0f5e7550e945ce7d1edd727883e79521471a4 Mon Sep 17 00:00:00 2001 From: Mikhail Puzanov Date: Mon, 28 Sep 2026 13:45:12 +0200 Subject: [PATCH 6/6] Bump cache GH action version --- .github/workflows/ci.yml | 2 +- .github/workflows/codeql.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b8f90e4..d1efe00 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,7 +19,7 @@ jobs: - uses: actions/checkout@v2 - name: Cache maven artifacts - uses: actions/cache@v2 + uses: actions/cache@v4 with: path: ~/.m2 key: ${{ runner.os }}-${{ matrix.java }}-${{ hashFiles('**/pom.xml') }} diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 9c8ed9c..7b57094 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -22,7 +22,7 @@ jobs: - uses: actions/checkout@v2 - name: Cache maven artifacts - uses: actions/cache@v2 + uses: actions/cache@v4 with: path: ~/.m2 key: ${{ runner.os }}-${{ matrix.java }}-${{ hashFiles('**/pom.xml') }}