From patchwork Wed May 9 05:36:59 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sam Mendoza-Jonas X-Patchwork-Id: 910660 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) (using TLSv1.2 with cipher ADH-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 40glqy6qY9z9s1w for ; Wed, 9 May 2018 15:52:30 +1000 (AEST) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=mendozajonas.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=mendozajonas.com header.i=@mendozajonas.com header.b="YlPPR4A4"; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=messagingengine.com header.i=@messagingengine.com header.b="nZdHcI+X"; dkim-atps=neutral Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 40glqy5M5wzF2Mb for ; Wed, 9 May 2018 15:52:30 +1000 (AEST) Authentication-Results: lists.ozlabs.org; dmarc=none (p=none dis=none) header.from=mendozajonas.com Authentication-Results: lists.ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=mendozajonas.com header.i=@mendozajonas.com header.b="YlPPR4A4"; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=messagingengine.com header.i=@messagingengine.com header.b="nZdHcI+X"; dkim-atps=neutral X-Original-To: petitboot@lists.ozlabs.org Delivered-To: petitboot@lists.ozlabs.org Authentication-Results: lists.ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=mendozajonas.com (client-ip=66.111.4.27; helo=out3-smtp.messagingengine.com; envelope-from=sam@mendozajonas.com; receiver=) Authentication-Results: lists.ozlabs.org; dmarc=none (p=none dis=none) header.from=mendozajonas.com Authentication-Results: lists.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=mendozajonas.com header.i=@mendozajonas.com header.b="YlPPR4A4"; dkim=pass (2048-bit key; unprotected) header.d=messagingengine.com header.i=@messagingengine.com header.b="nZdHcI+X"; dkim-atps=neutral Received: from out3-smtp.messagingengine.com (out3-smtp.messagingengine.com [66.111.4.27]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 40glVS2FYszF25j for ; Wed, 9 May 2018 15:37:20 +1000 (AEST) Received: from compute2.internal (compute2.nyi.internal [10.202.2.42]) by mailout.nyi.internal (Postfix) with ESMTP id DE06F22A84; Wed, 9 May 2018 01:37:17 -0400 (EDT) Received: from mailfrontend2 ([10.202.2.163]) by compute2.internal (MEProxy); Wed, 09 May 2018 01:37:17 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= mendozajonas.com; h=cc:date:from:in-reply-to:message-id :references:subject:to:x-me-sender:x-me-sender:x-sasl-enc; s= fm2; bh=zSQJDQCjSSO1SklQoG6Je9ph2Im/oc80JvUTufKdZvA=; b=YlPPR4A4 LfP/EnWrsmQziMhHwklgAF7Ka6pt4i2qYrA/0YLfd5AHbiJEo7tCNWKQ6MBsEXRM zBDs5zGIQMdTpuAmK2qasTjcDq4YAHi80JRivQK2IChuxB9A6cyMKsX2sn9Ismlu LSWzJQZAgIm1qmkd6c9zRzldF+fr5kNvfKZBO5CXeelfkp8y5/CoxBy2ginjT2ds RVNKJHT56JjiYkM5Y0b8RNmN+VxculyOsJXqJKQUsWTpEvULhTpE843Tr9FK/MdZ nsn7NUFCxSrxJixlfjcpWszkjxrHJ1qgGCPDNX79sk8ArrDYdSipmkXO5vnqlocJ kuST3acC4eSAmw== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:date:from:in-reply-to:message-id :references:subject:to:x-me-sender:x-me-sender:x-sasl-enc; s= fm2; bh=zSQJDQCjSSO1SklQoG6Je9ph2Im/oc80JvUTufKdZvA=; b=nZdHcI+X msYTrunYYDZOzNHGiZ/we/0g9F0y/xqDUkM3kbz2ISMTtcJSCgdNWsAWYS1nNf2z bjm+loRMaJuSuKdcJ9e8/kYA+uCNjn/3KA5zJ5CAdzWF8Wv8L0GVfQ2Gm8oST9rT 8tOdB5Ca7fOQdqudmLNMP6OWJb6s/Hg1K2W1IKkg7nBnxW1muk4Ps2NN6CbqSD8t bLi5RqvZgVONVrIP1M5n8H2YWC9uGHyhOWql/IROD6TqW1+17jHifVwaG8l7HN6F II5YfgOEkEe4ufA1sU/+QS87KnbThuL2Vt2BQIREvKfF8Qc/gSSTcpQ2elhGnfiZ zLG8HCPLtWGbYA== X-ME-Sender: Received: from v4.ozlabs.ibm.com (unknown [122.99.82.10]) by mail.messagingengine.com (Postfix) with ESMTPA id 9EAEA10253; Wed, 9 May 2018 01:37:16 -0400 (EDT) From: Samuel Mendoza-Jonas To: petitboot@lists.ozlabs.org Subject: [PATCH 1/7] lib/url: Parse IPv6 URLs Date: Wed, 9 May 2018 15:36:59 +1000 Message-Id: <20180509053705.3143-2-sam@mendozajonas.com> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180509053705.3143-1-sam@mendozajonas.com> References: <20180509053705.3143-1-sam@mendozajonas.com> X-BeenThere: petitboot@lists.ozlabs.org X-Mailman-Version: 2.1.26 Precedence: list List-Id: Petitboot bootloader development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Samuel Mendoza-Jonas MIME-Version: 1.0 Errors-To: petitboot-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Sender: "Petitboot" Signed-off-by: Samuel Mendoza-Jonas --- lib/url/url.c | 32 +++++++++++++++++++++++++----- test/urls/Makefile.am | 3 +++ test/urls/data/ipv6-full.test | 7 +++++++ test/urls/data/ipv6-multidirs.test | 7 +++++++ test/urls/data/ipv6-noport.test | 7 +++++++ 5 files changed, 51 insertions(+), 5 deletions(-) create mode 100644 test/urls/data/ipv6-full.test create mode 100644 test/urls/data/ipv6-multidirs.test create mode 100644 test/urls/data/ipv6-noport.test diff --git a/lib/url/url.c b/lib/url/url.c index 6eeced3..830151e 100644 --- a/lib/url/url.c +++ b/lib/url/url.c @@ -20,6 +20,7 @@ #include "config.h" #endif +#include #include #include @@ -197,19 +198,35 @@ struct pb_url *pb_url_parse(void *ctx, const char *url_str) goto fail; } - col = strchr(p, ':'); + col = strrchr(p, ':'); + if (col <= p) + col = NULL; + if (col && strchr(col , ']')) { + /* + * This is likely an IPv6 address with no port. + * See https://www.ietf.org/rfc/rfc2732.txt + */ + col = NULL; + } if (col) { len = path - col - 1; url->port = len ? talloc_strndup(url, col + 1, len) : NULL; len = col - p; - url->host = len ? talloc_strndup(url, p, len) : NULL; } else { url->port = NULL; - url->host = talloc_strndup(url, p, path - p); + len = path - p; } + if (p[0] == '[' && p[len - 1] == ']') + /* IPv6 */ + url->host = talloc_strndup(url, p + 1, len - 2); + else + /* IPv4 */ + url->host = talloc_strndup(url, p, len); + + /* remove multiple leading slashes */ for (; *path && *(path+1) == '/'; path++) ; @@ -234,10 +251,15 @@ bool is_url(const char *str) char *pb_url_to_string(struct pb_url *url) { const struct pb_scheme_info *scheme = pb_url_scheme_info(url->scheme); + uint8_t addr[INET6_ADDRSTRLEN]; assert(scheme); - return talloc_asprintf(url, "%s://%s%s", scheme->str, - scheme->has_host ? url->host : "", url->path); + if (scheme->has_host && inet_pton(AF_INET6, url->host, addr) == 1) + return talloc_asprintf(url, "%s://[%s]%s", scheme->str, + url->host, url->path); + else + return talloc_asprintf(url, "%s://%s%s", scheme->str, + scheme->has_host ? url->host : "", url->path); } static void pb_url_update_full(struct pb_url *url) diff --git a/test/urls/Makefile.am b/test/urls/Makefile.am index ad670b8..aab0f2b 100644 --- a/test/urls/Makefile.am +++ b/test/urls/Makefile.am @@ -20,6 +20,9 @@ test_urls_parse_url_LDADD = $(core_lib) url_TESTS = \ test/urls/data/double-slash.test \ test/urls/data/http-simple.test \ + test/urls/data/ipv6-full.test \ + test/urls/data/ipv6-multidirs.test \ + test/urls/data/ipv6-noport.test \ test/urls/data/join-full.test \ test/urls/data/join-absolute.test \ test/urls/data/join-relative.test \ diff --git a/test/urls/data/ipv6-full.test b/test/urls/data/ipv6-full.test new file mode 100644 index 0000000..b4943eb --- /dev/null +++ b/test/urls/data/ipv6-full.test @@ -0,0 +1,7 @@ +http://[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]:80/index.html +scheme http +host FEDC:BA98:7654:3210:FEDC:BA98:7654:3210 +port 80 +path /index.html +dir / +file index.html diff --git a/test/urls/data/ipv6-multidirs.test b/test/urls/data/ipv6-multidirs.test new file mode 100644 index 0000000..68b852a --- /dev/null +++ b/test/urls/data/ipv6-multidirs.test @@ -0,0 +1,7 @@ +tftp://[fd69:d65f:b8b5:61::1]/installers/ubuntu-18.04/vmlinux +scheme tftp +host fd69:d65f:b8b5:61::1 +port (null) +path /installers/ubuntu-18.04/vmlinux +dir /installers/ubuntu-18.04/ +file vmlinux diff --git a/test/urls/data/ipv6-noport.test b/test/urls/data/ipv6-noport.test new file mode 100644 index 0000000..bd3b008 --- /dev/null +++ b/test/urls/data/ipv6-noport.test @@ -0,0 +1,7 @@ +http://[1080:0:0:0:8:800:200C:417A]/index.html +scheme http +host 1080:0:0:0:8:800:200C:417A +port (null) +path /index.html +dir / +file index.html