summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2015-02-02 21:32:28 -0500
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2015-02-02 21:34:35 -0500
commit6cb8e687f038424ef54b5c5c3c433be974fbe371 (patch)
treeb905dd98bb19544edd2e2e3085a3820e4e33d29c
parentc1d630d5fd3c0b3307811d51f9840652e066a0f2 (diff)
network-address,test-network: avoid undefined behaviour
-rw-r--r--src/network/networkd-address.c4
-rw-r--r--src/network/test-network.c3
2 files changed, 5 insertions, 2 deletions
diff --git a/src/network/networkd-address.c b/src/network/networkd-address.c
index ce0e923cb..47033acde 100644
--- a/src/network/networkd-address.c
+++ b/src/network/networkd-address.c
@@ -592,6 +592,10 @@ bool address_equal(Address *a1, Address *a2) {
case AF_INET:
if (a1->prefixlen != a2->prefixlen)
return false;
+ else if (a1->prefixlen == 0)
+ /* make sure we don't try to shift by 32.
+ * See ISO/IEC 9899:TC3 § 6.5.7.3. */
+ return true;
else {
uint32_t b1, b2;
diff --git a/src/network/test-network.c b/src/network/test-network.c
index ea9f93864..b4a7be00f 100644
--- a/src/network/test-network.c
+++ b/src/network/test-network.c
@@ -158,10 +158,9 @@ static void test_address_equality(void) {
assert_se(address_equal(a1, a2));
assert_se(inet_pton(AF_INET, "192.168.3.9", &a1->in_addr.in));
- assert_se(!address_equal(a1, a2));
+ assert_se(address_equal(a1, a2));
assert_se(inet_pton(AF_INET, "192.168.3.9", &a2->in_addr.in));
assert_se(address_equal(a1, a2));
-
a1->prefixlen = 10;
assert_se(!address_equal(a1, a2));
a2->prefixlen = 10;