From owner-svn-src-head@freebsd.org Sat Feb 15 19:31:41 2020 Return-Path: Delivered-To: svn-src-head@mailman.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.nyi.freebsd.org (Postfix) with ESMTP id 43FDD246443; Sat, 15 Feb 2020 19:31:41 +0000 (UTC) (envelope-from kevans@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) server-signature RSA-PSS (4096 bits) client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 48KgNY161jz3BpD; Sat, 15 Feb 2020 19:31:41 +0000 (UTC) (envelope-from kevans@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 0838D19E6C; Sat, 15 Feb 2020 19:31:41 +0000 (UTC) (envelope-from kevans@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 01FJVewT097131; Sat, 15 Feb 2020 19:31:40 GMT (envelope-from kevans@FreeBSD.org) Received: (from kevans@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 01FJVebl097130; Sat, 15 Feb 2020 19:31:40 GMT (envelope-from kevans@FreeBSD.org) Message-Id: <202002151931.01FJVebl097130@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: kevans set sender to kevans@FreeBSD.org using -f From: Kyle Evans Date: Sat, 15 Feb 2020 19:31:40 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r357977 - head/lib/libfetch X-SVN-Group: head X-SVN-Commit-Author: kevans X-SVN-Commit-Paths: head/lib/libfetch X-SVN-Commit-Revision: 357977 X-SVN-Commit-Repository: base MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 15 Feb 2020 19:31:41 -0000 Author: kevans Date: Sat Feb 15 19:31:40 2020 New Revision: 357977 URL: https://svnweb.freebsd.org/changeset/base/357977 Log: fetch(3): move bits of fetch_socks5_getenv around This commit separates out port parsing and validation from grabbing the host from the env var. The only related bit really is that we need to be more specific with the delimiter in the IPv6 case. Modified: head/lib/libfetch/common.c Modified: head/lib/libfetch/common.c ============================================================================== --- head/lib/libfetch/common.c Sat Feb 15 19:15:24 2020 (r357976) +++ head/lib/libfetch/common.c Sat Feb 15 19:31:40 2020 (r357977) @@ -525,54 +525,50 @@ int fetch_socks5_getenv(char **host, int *port) { char *socks5env, *endptr, *ext; + const char *portDelim; + size_t slen; + portDelim = ":"; if ((socks5env = getenv("SOCKS5_PROXY")) == NULL || *socks5env == '\0') { *host = NULL; *port = -1; return (-1); } - /* IPv6 addresses begin and end in brackets */ + /* + * IPv6 addresses begin and end in brackets. Set the port delimiter + * accordingly and search for it so we can do appropriate validation. + */ + if (socks5env[0] == '[') + portDelim = "]:"; + + slen = strlen(socks5env); + ext = strstr(socks5env, portDelim); if (socks5env[0] == '[') { - if (socks5env[strlen(socks5env) - 1] == ']') { - *host = strndup(socks5env, strlen(socks5env)); + if (socks5env[slen - 1] == ']') { + *host = strndup(socks5env, slen); if (*host == NULL) goto fail; - *port = 1080; /* Default port as defined in RFC1928 */ - } else { - ext = strstr(socks5env, "]:"); - if (ext == NULL) { - socks5_seterr(SOCKS5_ERR_BAD_PROXY_FORMAT); - return (0); - } - ext=ext+1; - *host = strndup(socks5env, ext - socks5env); - if (*host == NULL) - goto fail; - errno = 0; - *port = strtoimax(ext + 1, (char **)&endptr, 10); - if (*endptr != '\0' || errno != 0 || *port < 0 || - *port > 65535) { - socks5_seterr(SOCKS5_ERR_BAD_PORT); - return (0); - } + } else if (ext == NULL) { + socks5_seterr(SOCKS5_ERR_BAD_PROXY_FORMAT); + return (0); } } else { - ext = strrchr(socks5env, ':'); - if (ext == NULL) { - *host = strdup(socks5env); - *port = 1080; - } else { - *host = strndup(socks5env, ext-socks5env); - if (*host == NULL) - goto fail; - errno = 0; - *port = strtoimax(ext + 1, (char **)&endptr, 10); - if (*endptr != '\0' || errno != 0 || *port < 0 || - *port > 65535) { - socks5_seterr(SOCKS5_ERR_BAD_PORT); - return (0); - } + *host = strndup(socks5env, ext - socks5env); + if (*host == NULL) + goto fail; + } + + if (ext == NULL) { + *port = 1080; /* Default port as defined in RFC1928 */ + } else { + ext += strlen(portDelim); + errno = 0; + *port = strtoimax(ext, (char **)&endptr, 10); + if (*endptr != '\0' || errno != 0 || *port < 0 || + *port > 65535) { + socks5_seterr(SOCKS5_ERR_BAD_PORT); + return (0); } }