From: Michael Tremer Date: Tue, 24 Nov 2020 16:50:17 +0000 (+0000) Subject: network: Adjust return codes of loc_network_match_address and add test X-Git-Tag: 0.9.5~27 X-Git-Url: http://git.ipfire.org/?p=people%2Fms%2Flibloc.git;a=commitdiff_plain;h=fc692a58d9f4ca958f88cfa202250c572a0af6ea network: Adjust return codes of loc_network_match_address and add test Signed-off-by: Michael Tremer --- diff --git a/src/database.c b/src/database.c index 914ed3e..1871b74 100644 --- a/src/database.c +++ b/src/database.c @@ -776,8 +776,7 @@ static int __loc_database_lookup_handle_leaf(struct loc_database* db, const stru } // Check if the given IP address is inside the network - r = loc_network_match_address(*network, address); - if (r) { + if (!loc_network_match_address(*network, address)) { DEBUG(db->ctx, "Searched address is not part of the network\n"); loc_network_unref(*network); diff --git a/src/libloc.sym b/src/libloc.sym index cb5e8ef..ee333f1 100644 --- a/src/libloc.sym +++ b/src/libloc.sym @@ -117,6 +117,7 @@ global: loc_network_get_last_address; loc_network_has_flag; loc_network_is_subnet; + loc_network_match_address; loc_network_match_asn; loc_network_match_country_code; loc_network_match_flag; diff --git a/src/network.c b/src/network.c index ac478d5..febab95 100644 --- a/src/network.c +++ b/src/network.c @@ -374,14 +374,14 @@ LOC_EXPORT char* loc_network_format_last_address(struct loc_network* network) { LOC_EXPORT int loc_network_match_address(struct loc_network* network, const struct in6_addr* address) { // Address must be larger than the start address if (in6_addr_cmp(&network->first_address, address) > 0) - return 1; + return 0; // Address must be smaller than the last address if (in6_addr_cmp(&network->last_address, address) < 0) - return 1; + return 0; // The address is inside this network - return 0; + return 1; } LOC_EXPORT const char* loc_network_get_country_code(struct loc_network* network) { @@ -464,16 +464,18 @@ LOC_EXPORT int loc_network_cmp(struct loc_network* self, struct loc_network* oth } LOC_EXPORT int loc_network_overlaps(struct loc_network* self, struct loc_network* other) { - if (loc_network_match_address(self, &other->first_address) == 0) + // Either of the start addresses must be in the other subnet + if (loc_network_match_address(self, &other->first_address)) return 1; - if (loc_network_match_address(self, &other->last_address) == 0) + if (loc_network_match_address(other, &self->first_address)) return 1; - if (loc_network_match_address(other, &self->first_address) == 0) + // Or either of the end addresses is in the other subnet + if (loc_network_match_address(self, &other->last_address)) return 1; - if (loc_network_match_address(other, &self->last_address) == 0) + if (loc_network_match_address(other, &self->last_address)) return 1; return 0; diff --git a/src/test-network.c b/src/test-network.c index f4cf97b..339743d 100644 --- a/src/test-network.c +++ b/src/test-network.c @@ -14,6 +14,7 @@ GNU General Public License for more details. */ +#include #include #include #include @@ -46,6 +47,13 @@ int main(int argc, char** argv) { } #endif + struct in6_addr address; + err = inet_pton(AF_INET6, "2001:db8::1", &address); + if (err != 1) { + fprintf(stderr, "Could not parse IP address\n"); + exit(EXIT_FAILURE); + } + // Create a network struct loc_network* network1; err = loc_network_new_from_string(ctx, &network1, "2001:db8::1/32"); @@ -92,6 +100,12 @@ int main(int argc, char** argv) { exit(EXIT_FAILURE); } + err = loc_network_match_address(network1, &address); + if (!err) { + fprintf(stderr, "Network1 does not match address\n"); + exit(EXIT_FAILURE); + } + struct loc_network* network2; err = loc_network_new_from_string(ctx, &network2, "2001:db8:ffff::/48"); if (err) {