aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIngo Bauersachs <ingo@jitsi.org>2012-01-15 17:01:56 +0000
committerIngo Bauersachs <ingo@jitsi.org>2012-01-15 17:01:56 +0000
commitec7caabb711228445c961e4474808bbc7c193123 (patch)
treeabcee3560c41bd2fd8fbd0008dd224852cb5d612
parent7ac553e63b6a6d9e8d47b388e697d1b1b7ec069e (diff)
downloadjitsi-ec7caabb711228445c961e4474808bbc7c193123.zip
jitsi-ec7caabb711228445c961e4474808bbc7c193123.tar.gz
jitsi-ec7caabb711228445c961e4474808bbc7c193123.tar.bz2
Fix stackoverflow on SIP server resolution when SRV host entry is unresolvable
-rw-r--r--src/net/java/sip/communicator/impl/protocol/sip/net/AutoProxyConnection.java8
-rw-r--r--test/net/java/sip/communicator/slick/protocol/sip/TestAutoProxyDetection.java44
2 files changed, 50 insertions, 2 deletions
diff --git a/src/net/java/sip/communicator/impl/protocol/sip/net/AutoProxyConnection.java b/src/net/java/sip/communicator/impl/protocol/sip/net/AutoProxyConnection.java
index 9dc01ac..4846bb8 100644
--- a/src/net/java/sip/communicator/impl/protocol/sip/net/AutoProxyConnection.java
+++ b/src/net/java/sip/communicator/impl/protocol/sip/net/AutoProxyConnection.java
@@ -303,6 +303,11 @@ public class AutoProxyConnection
}
return false;
case SrvHosts:
+ if(srvRecordsIndex >= srvRecords.length)
+ {
+ state = State.Srv;
+ return getNextAddressFromDns(); //backtrack to next srv record
+ }
for(; srvRecordsIndex < srvRecords.length; srvRecordsIndex++)
{
socketAddresses = nu.getAandAAAARecords(
@@ -319,8 +324,7 @@ public class AutoProxyConnection
}
}
}
- state = State.Srv;
- return getNextAddressFromDns(); //backtrack to next srv record
+ return false;
case SrvHostIPs:
if(socketAddressIndex >= socketAddresses.length)
{
diff --git a/test/net/java/sip/communicator/slick/protocol/sip/TestAutoProxyDetection.java b/test/net/java/sip/communicator/slick/protocol/sip/TestAutoProxyDetection.java
index 634d275..06cb70d 100644
--- a/test/net/java/sip/communicator/slick/protocol/sip/TestAutoProxyDetection.java
+++ b/test/net/java/sip/communicator/slick/protocol/sip/TestAutoProxyDetection.java
@@ -281,6 +281,22 @@ public class TestAutoProxyDetection
verify(account, nu);
}
+ public void testOneSrvNoA() throws ParseException, DnssecException
+ {
+ expect(nu.getNAPTRRecords(DOMAIN)).andReturn(new String[][]{});
+ expect(nu.getSRVRecords("sips", "TCP", DOMAIN)).andReturn(null);
+ expect(nu.getSRVRecords("sip", "TCP", DOMAIN)).andReturn(null);
+ expect(nu.getSRVRecords("sip", "UDP", DOMAIN))
+ .andReturn(new SRVRecord[]{srv1});
+ expect(nu.getAandAAAARecords("proxy1." + DOMAIN, 5060))
+ .andReturn(null);
+
+ replay(nu, srv1);
+
+ assertFalse(apd.getNextAddress());
+ verify(account, nu, srv1);
+ }
+
public void testOneSrvOneA() throws ParseException, DnssecException
{
expect(nu.getNAPTRRecords(DOMAIN)).andReturn(new String[][]{});
@@ -352,6 +368,34 @@ public class TestAutoProxyDetection
verify(account, nu, srv1, srv2);
}
+ public void testTwoSameSrvOneA() throws ParseException, DnssecException
+ {
+ expect(nu.getNAPTRRecords(DOMAIN)).andReturn(new String[][]{});
+ expect(nu.getSRVRecords("sips", "TCP", DOMAIN))
+ .andReturn(new SRVRecord[]{srv1, srv2});
+ expect(nu.getSRVRecords("sip", "TCP", DOMAIN)).andReturn(null);
+ expect(nu.getSRVRecords("sip", "UDP", DOMAIN)).andReturn(null);
+ expect(nu.getAandAAAARecords("proxy1." + DOMAIN, 5060))
+ .andReturn(new InetSocketAddress[]{a1});
+ expect(nu.getAandAAAARecords("proxy2." + DOMAIN, 5061))
+ .andReturn(new InetSocketAddress[]{a2});
+
+ replay(nu, srv1, srv2);
+
+ assertTrue(apd.getNextAddress());
+ assertEquals(a1, apd.getAddress());
+ assertEquals("TLS", apd.getTransport());
+ assertEquals(5060, apd.getAddress().getPort());
+
+ assertTrue(apd.getNextAddress());
+ assertEquals(a2, apd.getAddress());
+ assertEquals("TLS", apd.getTransport());
+ assertEquals(5061, apd.getAddress().getPort());
+
+ assertFalse(apd.getNextAddress());
+ verify(account, nu, srv1, srv2);
+ }
+
//----------------------
public void testNoA() throws ParseException, DnssecException