This is an automated email from the ASF dual-hosted git repository.

DaanHoogland pushed a commit to branch 4.20
in repository https://gitbox.apache.org/repos/asf/cloudstack.git


The following commit(s) were added to refs/heads/4.20 by this push:
     new 4b2d387287a server: null-check requested IP in 
assignSourceNatPublicIpAddress (#14025)
4b2d387287a is described below

commit 4b2d387287a3d49adeef183716fb4ab0d0c1fdf3
Author: Ramgopal Nagaboina <[email protected]>
AuthorDate: Thu Oct 1 10:41:33 2026 -0400

    server: null-check requested IP in assignSourceNatPublicIpAddress (#14025)
---
 .../com/cloud/network/IpAddressManagerImpl.java    |  2 +-
 .../network/IpAddressManagerImplSourceNatTest.java | 58 ++++++++++++++++++++++
 2 files changed, 59 insertions(+), 1 deletion(-)

diff --git a/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java 
b/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java
index 25bc29a3568..d4743a6aec9 100644
--- a/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java
+++ b/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java
@@ -828,7 +828,7 @@ public class IpAddressManagerImpl extends ManagerBase 
implements IpAddressManage
         if(networkPublicIp != null)
             return null;
         IPAddressVO ipAddressVO = _ipAddressDao.findByIpAndDcId(dcId, 
requestedIp);
-        if (ipAddressVO.getState() != State.Free) {
+        if (ipAddressVO == null || ipAddressVO.getState() != State.Free) {
             throw new InsufficientAddressCapacityException("can not assign to 
this network", Network.class, networkId);
         }
         return fetchNewPublicIp(dcId, podId, null, owner, type, networkId, 
true, true, requestedIp, null, isSystem, null, null, forSystemVms);
diff --git 
a/server/src/test/java/com/cloud/network/IpAddressManagerImplSourceNatTest.java 
b/server/src/test/java/com/cloud/network/IpAddressManagerImplSourceNatTest.java
new file mode 100644
index 00000000000..d5c9eead860
--- /dev/null
+++ 
b/server/src/test/java/com/cloud/network/IpAddressManagerImplSourceNatTest.java
@@ -0,0 +1,58 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package com.cloud.network;
+
+import static org.mockito.Mockito.when;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.junit.MockitoJUnitRunner;
+
+import com.cloud.dc.Vlan.VlanType;
+import com.cloud.exception.InsufficientAddressCapacityException;
+import com.cloud.network.dao.IPAddressDao;
+import com.cloud.user.Account;
+
+@RunWith(MockitoJUnitRunner.class)
+public class IpAddressManagerImplSourceNatTest {
+
+    @Mock
+    private IPAddressDao _ipAddressDao;
+
+    @InjectMocks
+    private IpAddressManagerImpl ipAddressManagerImpl = new 
IpAddressManagerImpl();
+
+    @Test(expected = InsufficientAddressCapacityException.class)
+    public void assignSourceNatPublicIpAddressThrowsWhenRequestedIpNotFound() 
throws Exception {
+        // findByIpAndDcId returns null when the requested IP is not a known
+        // public IP in the zone. The method must throw a capacity exception
+        // rather than dereference the null IPAddressVO with getState().
+        long dcId = 1L;
+        long networkId = 2L;
+        String requestedIp = "10.1.1.1";
+        Account owner = Mockito.mock(Account.class);
+
+        when(_ipAddressDao.findByIpAndNetworkIdAndDcId(networkId, dcId, 
requestedIp)).thenReturn(null);
+        when(_ipAddressDao.findByIpAndDcId(dcId, 
requestedIp)).thenReturn(null);
+
+        ipAddressManagerImpl.assignSourceNatPublicIpAddress(dcId, null, owner, 
VlanType.VirtualNetwork,
+                networkId, requestedIp, false, false);
+    }
+}

Reply via email to