summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOlivier CrĂȘte <olivier.crete@collabora.com>2020-05-06 00:00:36 -0400
committerOlivier CrĂȘte <olivier.crete@ocrete.ca>2020-05-06 22:32:32 +0000
commit04ae880c01932ea5cec67db53e1387b7abf47f74 (patch)
treea51232b10a8a96a16f6e31ecb385be6eec043caa
parentf6b4a73bfc66675f4e8cae0115c089b6f522289f (diff)
downloadlibnice-04ae880c01932ea5cec67db53e1387b7abf47f74.tar.gz
address: Make the private IP address detector more complete
Also adds a unit test Fixes #67
-rw-r--r--agent/address.c14
-rw-r--r--tests/test-address.c64
2 files changed, 73 insertions, 5 deletions
diff --git a/agent/address.c b/agent/address.c
index 3c20220..8508c6f 100644
--- a/agent/address.c
+++ b/agent/address.c
@@ -298,14 +298,18 @@ ipv4_address_is_private (guint32 addr)
{
addr = ntohl (addr);
- /* http://tools.ietf.org/html/rfc3330 */
+ /* http://tools.ietf.org/html/rfc3330
+ * https://tools.ietf.org/html/rfc3927
+ */
return (
/* 10.0.0.0/8 */
((addr & 0xff000000) == 0x0a000000) ||
- /* 172.16.0.0/12 */
+ /* 172.16.0.0 - 172.31.255.255 = 172.16.0.0/12 */
((addr & 0xfff00000) == 0xac100000) ||
/* 192.168.0.0/16 */
((addr & 0xffff0000) == 0xc0a80000) ||
+ /* 169.254.x.x/16 (for APIPA) */
+ ((addr & 0xffff0000) == 0xa9fe0000) ||
/* 127.0.0.0/8 */
((addr & 0xff000000) == 0x7f000000));
}
@@ -315,9 +319,11 @@ static gboolean
ipv6_address_is_private (const guchar *addr)
{
return (
- /* fe80::/10 */
+ /* fe80::/10 (link local addresses, needs scope) */
((addr[0] == 0xfe) && ((addr[1] & 0xc0) == 0x80)) ||
- /* fc00::/7 */
+ /* fd00::/8 (official private IP block) */
+ (addr[0] == 0xfd) ||
+ /* fc00::/7 (those are ULA) */
((addr[0] & 0xfe) == 0xfc) ||
/* ::1 loopback */
((memcmp (addr, "\x00\x00\x00\x00"
diff --git a/tests/test-address.c b/tests/test-address.c
index 8e05050..583830e 100644
--- a/tests/test-address.c
+++ b/tests/test-address.c
@@ -84,9 +84,71 @@ test_ipv4 (void)
/* test private address check */
{
NiceAddress *heap_addr = nice_address_new ();
+
+ g_assert (nice_address_set_from_string (heap_addr, "127.0.0.1.1") != TRUE);
+
g_assert (nice_address_set_from_string (heap_addr, "127.0.0.1") == TRUE);
g_assert (nice_address_is_private (heap_addr) == TRUE);
- g_assert (nice_address_set_from_string (heap_addr, "127.0.0.1.1") != TRUE);
+
+ g_assert (nice_address_set_from_string (heap_addr, "127.1.1.1") == TRUE);
+ g_assert (nice_address_is_private (heap_addr) == TRUE);
+
+ g_assert (nice_address_set_from_string(heap_addr, "192.168.2.0"));
+ g_assert (nice_address_is_private (heap_addr) == TRUE);
+
+ g_assert (nice_address_set_from_string(heap_addr, "192.168.15.69"));
+ g_assert (nice_address_is_private (heap_addr) == TRUE);
+
+ g_assert (nice_address_set_from_string(heap_addr, "192.169.0.0"));
+ g_assert (nice_address_is_private (heap_addr) == FALSE);
+
+ g_assert (nice_address_set_from_string(heap_addr, "192.167.0.0"));
+ g_assert (nice_address_is_private (heap_addr) == FALSE);
+
+ g_assert (nice_address_set_from_string(heap_addr, "10.2.1.2"));
+ g_assert (nice_address_is_private (heap_addr) == TRUE);
+
+ g_assert (nice_address_set_from_string(heap_addr, "11.0.0.0"));
+ g_assert (nice_address_is_private (heap_addr) == FALSE);
+
+ g_assert (nice_address_set_from_string(heap_addr, "9.255.255.255"));
+ g_assert (nice_address_is_private (heap_addr) == FALSE);
+
+ g_assert (nice_address_set_from_string(heap_addr, "172.15.255.255"));
+ g_assert (nice_address_is_private (heap_addr) == FALSE);
+
+ g_assert (nice_address_set_from_string(heap_addr, "172.16.0.0"));
+ g_assert (nice_address_is_private (heap_addr) == TRUE);
+
+ g_assert (nice_address_set_from_string(heap_addr, "172.31.255.255"));
+ g_assert (nice_address_is_private (heap_addr) == TRUE);
+
+ g_assert (nice_address_set_from_string(heap_addr, "172.32.0.0"));
+ g_assert (nice_address_is_private (heap_addr) == FALSE);
+ g_assert (nice_address_set_from_string(heap_addr, "172.63.0.0"));
+ g_assert (nice_address_is_private (heap_addr) == FALSE);
+
+ g_assert (nice_address_set_from_string(heap_addr, "169.253.255.255"));
+ g_assert (nice_address_is_private (heap_addr) == FALSE);
+
+ g_assert (nice_address_set_from_string(heap_addr, "169.254.0.0"));
+ g_assert (nice_address_is_private (heap_addr) == TRUE);
+
+ g_assert (nice_address_set_from_string(heap_addr, "169.254.255.255"));
+ g_assert (nice_address_is_private (heap_addr) == TRUE);
+
+ g_assert (nice_address_set_from_string(heap_addr, "169.255.0.0"));
+ g_assert (nice_address_is_private (heap_addr) == FALSE);
+
+ g_assert (nice_address_set_from_string(heap_addr, "fe70::0"));
+ g_assert (nice_address_is_private (heap_addr) == FALSE);
+
+ g_assert (nice_address_set_from_string(heap_addr, "fe80::0"));
+ g_assert (nice_address_is_private (heap_addr) == TRUE);
+
+ g_assert (nice_address_set_from_string(heap_addr, "fe81::0"));
+ g_assert (nice_address_is_private (heap_addr) == TRUE);
+
nice_address_free (heap_addr);
}
}