From f58b02f2cf068e1bed10bf9f632bad396d907de9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sa=C3=BAl=20Ibarra=20Corretg=C3=A9?= <saghul@gmail.com> Date: Fri, 23 May 2014 09:25:23 +0200 Subject: [PATCH] unix, windows: fix parsing scoped IPv6 addresses --- src/inet.c | 37 +++++++++++++++++++++---------------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/src/inet.c b/src/inet.c index 0eb9438..36457f4 100644 --- a/src/inet.c +++ b/src/inet.c @@ -17,6 +17,7 @@ #include <stdio.h> #include <string.h> +#include <stdlib.h> #if defined(_MSC_VER) && _MSC_VER < 1600 # include "stdint-msvc2008.h" @@ -159,11 +160,27 @@ static int inet_ntop6(const unsigned char *src, char *dst, size_t size) { int uv_inet_pton(int af, const char* src, void* dst) { + if (src == NULL || dst == NULL) + return UV_EINVAL; + switch (af) { case AF_INET: return (inet_pton4(src, dst)); - case AF_INET6: - return (inet_pton6(src, dst)); + case AF_INET6: { + int len; + char tmp[UV__INET6_ADDRSTRLEN], *s, *p; + s = (char*) src; + p = strchr(src, '%'); + if (p != NULL) { + s = tmp; + len = p - src; + if (len > UV__INET6_ADDRSTRLEN-1) + len = UV__INET6_ADDRSTRLEN-1; + memcpy(s, src, len); + s[len] = '\0'; + } + return inet_pton6(s, dst); + } default: return UV_EAFNOSUPPORT; } @@ -228,7 +245,7 @@ static int inet_pton6(const char *src, unsigned char *dst) { curtok = src; seen_xdigits = 0; val = 0; - while ((ch = *src++) != '\0' && ch != '%') { + while ((ch = *src++) != '\0') { const char *pch; if ((pch = strchr((xdigits = xdigits_l), ch)) == NULL) @@ -259,19 +276,7 @@ static int inet_pton6(const char *src, unsigned char *dst) { continue; } if (ch == '.' && ((tp + sizeof(struct in_addr)) <= endp)) { - int err; - - /* Scope id present, parse ipv4 addr without it */ - pch = strchr(curtok, '%'); - if (pch != NULL) { - char tmp[sizeof "255.255.255.255"]; - - memcpy(tmp, curtok, pch - curtok); - curtok = tmp; - src = pch; - } - - err = inet_pton4(curtok, tp); + int err = inet_pton4(curtok, tp); if (err == 0) { tp += sizeof(struct in_addr); seen_xdigits = 0; -- 1.9.3