diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/libpq/hba.c | 42 | ||||
-rw-r--r-- | src/backend/libpq/ip.c | 73 | ||||
-rw-r--r-- | src/include/libpq/ip.h | 5 |
3 files changed, 6 insertions, 114 deletions
diff --git a/src/backend/libpq/hba.c b/src/backend/libpq/hba.c index 8c8213448a8..a0f53960361 100644 --- a/src/backend/libpq/hba.c +++ b/src/backend/libpq/hba.c @@ -680,42 +680,12 @@ check_hostname(hbaPort *port, const char *hostname) static bool check_ip(SockAddr *raddr, struct sockaddr * addr, struct sockaddr * mask) { - if (raddr->addr.ss_family == addr->sa_family) - { - /* Same address family */ - if (!pg_range_sockaddr(&raddr->addr, - (struct sockaddr_storage *) addr, - (struct sockaddr_storage *) mask)) - return false; - } -#ifdef HAVE_IPV6 - else if (addr->sa_family == AF_INET && - raddr->addr.ss_family == AF_INET6) - { - /* - * If we're connected on IPv6 but the file specifies an IPv4 address - * to match against, promote the latter to an IPv6 address before - * trying to match the client's address. - */ - struct sockaddr_storage addrcopy, - maskcopy; - - memcpy(&addrcopy, addr, sizeof(addrcopy)); - memcpy(&maskcopy, mask, sizeof(maskcopy)); - pg_promote_v4_to_v6_addr(&addrcopy); - pg_promote_v4_to_v6_mask(&maskcopy); - - if (!pg_range_sockaddr(&raddr->addr, &addrcopy, &maskcopy)) - return false; - } -#endif /* HAVE_IPV6 */ - else - { - /* Wrong address family, no IPV6 */ - return false; - } - - return true; + if (raddr->addr.ss_family == addr->sa_family && + pg_range_sockaddr(&raddr->addr, + (struct sockaddr_storage *) addr, + (struct sockaddr_storage *) mask)) + return true; + return false; } /* diff --git a/src/backend/libpq/ip.c b/src/backend/libpq/ip.c index 995a258764a..db939b524ae 100644 --- a/src/backend/libpq/ip.c +++ b/src/backend/libpq/ip.c @@ -407,79 +407,6 @@ pg_sockaddr_cidr_mask(struct sockaddr_storage * mask, char *numbits, int family) } -#ifdef HAVE_IPV6 - -/* - * pg_promote_v4_to_v6_addr --- convert an AF_INET addr to AF_INET6, using - * the standard convention for IPv4 addresses mapped into IPv6 world - * - * The passed addr is modified in place; be sure it is large enough to - * hold the result! Note that we only worry about setting the fields - * that pg_range_sockaddr will look at. - */ -void -pg_promote_v4_to_v6_addr(struct sockaddr_storage * addr) -{ - struct sockaddr_in addr4; - struct sockaddr_in6 addr6; - uint32 ip4addr; - - memcpy(&addr4, addr, sizeof(addr4)); - ip4addr = ntohl(addr4.sin_addr.s_addr); - - memset(&addr6, 0, sizeof(addr6)); - - addr6.sin6_family = AF_INET6; - - addr6.sin6_addr.s6_addr[10] = 0xff; - addr6.sin6_addr.s6_addr[11] = 0xff; - addr6.sin6_addr.s6_addr[12] = (ip4addr >> 24) & 0xFF; - addr6.sin6_addr.s6_addr[13] = (ip4addr >> 16) & 0xFF; - addr6.sin6_addr.s6_addr[14] = (ip4addr >> 8) & 0xFF; - addr6.sin6_addr.s6_addr[15] = (ip4addr) & 0xFF; - - memcpy(addr, &addr6, sizeof(addr6)); -} - -/* - * pg_promote_v4_to_v6_mask --- convert an AF_INET netmask to AF_INET6, using - * the standard convention for IPv4 addresses mapped into IPv6 world - * - * This must be different from pg_promote_v4_to_v6_addr because we want to - * set the high-order bits to 1's not 0's. - * - * The passed addr is modified in place; be sure it is large enough to - * hold the result! Note that we only worry about setting the fields - * that pg_range_sockaddr will look at. - */ -void -pg_promote_v4_to_v6_mask(struct sockaddr_storage * addr) -{ - struct sockaddr_in addr4; - struct sockaddr_in6 addr6; - uint32 ip4addr; - int i; - - memcpy(&addr4, addr, sizeof(addr4)); - ip4addr = ntohl(addr4.sin_addr.s_addr); - - memset(&addr6, 0, sizeof(addr6)); - - addr6.sin6_family = AF_INET6; - - for (i = 0; i < 12; i++) - addr6.sin6_addr.s6_addr[i] = 0xff; - - addr6.sin6_addr.s6_addr[12] = (ip4addr >> 24) & 0xFF; - addr6.sin6_addr.s6_addr[13] = (ip4addr >> 16) & 0xFF; - addr6.sin6_addr.s6_addr[14] = (ip4addr >> 8) & 0xFF; - addr6.sin6_addr.s6_addr[15] = (ip4addr) & 0xFF; - - memcpy(addr, &addr6, sizeof(addr6)); -} -#endif /* HAVE_IPV6 */ - - /* * Run the callback function for the addr/mask, after making sure the * mask is sane for the addr. diff --git a/src/include/libpq/ip.h b/src/include/libpq/ip.h index 23051c0ba7f..796dd417229 100644 --- a/src/include/libpq/ip.h +++ b/src/include/libpq/ip.h @@ -46,11 +46,6 @@ extern int pg_range_sockaddr(const struct sockaddr_storage * addr, extern int pg_sockaddr_cidr_mask(struct sockaddr_storage * mask, char *numbits, int family); -#ifdef HAVE_IPV6 -extern void pg_promote_v4_to_v6_addr(struct sockaddr_storage * addr); -extern void pg_promote_v4_to_v6_mask(struct sockaddr_storage * addr); -#endif - extern int pg_foreach_ifaddr(PgIfAddrCallback callback, void *cb_data); #endif /* IP_H */ |