From 2e57e339798f47ad84cae9121559d19192b79146 Mon Sep 17 00:00:00 2001 From: Michal Zidek Date: Tue, 1 Oct 2013 16:22:13 +0200 Subject: util: Add functions to check if IP addresses is special Added functions to check if given IP address is a special address (broadcast, multicast...). --- src/util/util.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/util/util.h | 13 +++++++++++++ 2 files changed, 70 insertions(+) (limited to 'src/util') diff --git a/src/util/util.c b/src/util/util.c index fb3bed146..9ab154db3 100644 --- a/src/util/util.c +++ b/src/util/util.c @@ -22,6 +22,7 @@ #include #include #include +#include #include "talloc.h" #include "util/util.h" @@ -739,3 +740,59 @@ bool is_host_in_domain(const char *host, const char *domain) return false; } + +/* addr is in network order for both IPv4 and IPv6 versions */ +bool check_ipv4_addr(struct in_addr *addr, uint8_t flags) +{ + char straddr[INET_ADDRSTRLEN]; + + if (inet_ntop(AF_INET, addr, straddr, INET_ADDRSTRLEN) == NULL) { + DEBUG(SSSDBG_MINOR_FAILURE, + ("inet_ntop failed, won't log IP addresses\n")); + snprintf(straddr, INET_ADDRSTRLEN, "unknown"); + } + + if ((flags & SSS_NO_MULTICAST) && IN_MULTICAST(ntohl(addr->s_addr))) { + DEBUG(SSSDBG_FUNC_DATA, ("Multicast IPv4 address %s\n", straddr)); + return false; + } else if ((flags & SSS_NO_LOOPBACK) + && inet_netof(*addr) == IN_LOOPBACKNET) { + DEBUG(SSSDBG_FUNC_DATA, ("Loopback IPv4 address %s\n", straddr)); + return false; + } else if ((flags & SSS_NO_LINKLOCAL) + && (addr->s_addr & htonl(0xffff0000)) == htonl(0xa9fe0000)) { + /* 169.254.0.0/16 */ + DEBUG(SSSDBG_FUNC_DATA, ("Link-local IPv4 address %s\n", straddr)); + return false; + } else if ((flags & SSS_NO_BROADCAST) + && addr->s_addr == htonl(INADDR_BROADCAST)) { + DEBUG(SSSDBG_FUNC_DATA, ("Broadcast IPv4 address %s\n", straddr)); + return false; + } + + return true; +} + +bool check_ipv6_addr(struct in6_addr *addr, uint8_t flags) +{ + char straddr[INET6_ADDRSTRLEN]; + + if (inet_ntop(AF_INET6, addr, straddr, INET6_ADDRSTRLEN) == NULL) { + DEBUG(SSSDBG_MINOR_FAILURE, + ("inet_ntop failed, won't log IP addresses\n")); + snprintf(straddr, INET6_ADDRSTRLEN, "unknown"); + } + + if ((flags & SSS_NO_LINKLOCAL) && IN6_IS_ADDR_LINKLOCAL(addr)) { + DEBUG(SSSDBG_FUNC_DATA, ("Link local IPv6 address %s\n", straddr)); + return false; + } else if ((flags & SSS_NO_LOOPBACK) && IN6_IS_ADDR_LOOPBACK(addr)) { + DEBUG(SSSDBG_FUNC_DATA, ("Loopback IPv6 address %s\n", straddr)); + return false; + } else if ((flags & SSS_NO_MULTICAST) && IN6_IS_ADDR_MULTICAST(addr)) { + DEBUG(SSSDBG_FUNC_DATA, ("Multicast IPv6 address %s\n", straddr)); + return false; + } + + return true; +} diff --git a/src/util/util.h b/src/util/util.h index 98b86e9db..3789c278c 100644 --- a/src/util/util.h +++ b/src/util/util.h @@ -37,6 +37,7 @@ #include #include #include +#include #include #include @@ -438,6 +439,18 @@ errno_t check_and_open_readonly(const char *filename, int *fd, const uid_t uid, enum check_file_type type); /* from util.c */ +#define SSS_NO_LINKLOCAL 0x01 +#define SSS_NO_LOOPBACK 0x02 +#define SSS_NO_MULTICAST 0x04 +#define SSS_NO_BROADCAST 0x08 + +#define SSS_NO_SPECIAL \ + (SSS_NO_LINKLOCAL|SSS_NO_LOOPBACK|SSS_NO_MULTICAST|SSS_NO_BROADCAST) + +/* These two functions accept addr in network order */ +bool check_ipv4_addr(struct in_addr *addr, uint8_t check); +bool check_ipv6_addr(struct in6_addr *addr, uint8_t check); + int split_on_separator(TALLOC_CTX *mem_ctx, const char *str, const char sep, bool trim, bool skip_empty, char ***_list, int *size); -- cgit