Browse Source

radix: fix ipv4 mapped ipv6 address.

Nick Peng 3 months ago
parent
commit
afaad9b529
1 changed files with 15 additions and 1 deletions
  1. 15 1
      src/lib/radix.c

+ 15 - 1
src/lib/radix.c

@@ -560,12 +560,24 @@ sanitise_mask(unsigned char *addr, unsigned int masklen, unsigned int maskbits)
 		addr[i] = 0;
 }
 
+static void
+update_addr(const char **addr_ptr, const char *addr, size_t len)
+{
+	const char *ipv6_prefix = "::ffff:0:0";
+
+	if (strncmp(addr, "::ffff", len) == 0) 
+		*addr_ptr = ipv6_prefix;
+	else
+		*addr_ptr = (char *)addr;
+}
+
 prefix_t
 *prefix_pton(const char *string, long len, prefix_t *prefix, const char **errmsg)
 {
 	char save[256], *cp, *ep;
 	struct addrinfo hints, *ai;
 	void *addr;
+	const char *addr_str = NULL;
 	prefix_t *ret;
 	size_t slen;
 	int r;
@@ -595,7 +607,9 @@ prefix_t
 	memset(&hints, '\0', sizeof(hints));
 	hints.ai_flags = AI_NUMERICHOST;
 
-	if ((r = getaddrinfo(save, NULL, &hints, &ai)) != 0) {
+	update_addr(&addr_str, save, slen);
+
+	if ((r = getaddrinfo(addr_str, NULL, &hints, &ai)) != 0) {
 		snprintf(save, sizeof(save), "getaddrinfo: %s:",
 		    gai_strerror(r));
 		*errmsg = save;