From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pg1-x536.google.com (mail-pg1-x536.google.com [IPv6:2607:f8b0:4864:20::536]) by sourceware.org (Postfix) with ESMTPS id 5E4BD3858D20 for ; Sun, 17 Mar 2024 03:19:35 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 5E4BD3858D20 Authentication-Results: sourceware.org; dmarc=pass (p=reject dis=none) header.from=fastly.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=fastly.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 5E4BD3858D20 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2607:f8b0:4864:20::536 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1710645577; cv=none; b=hfx0C2CeScKSFuWM4zC6sae/9v874i5WWvuEpDAEcg1PZWkSXXfqOFktPm0AME1qdTTspkB468zT39D/62Sa/PZOVg9fpObZDNYSOyaSyML+TbEZMuZj1KeFIieoQK+dvJIBWIJc4IqIWXiASbC3m3+2EzYFHfvrN8GVJn2DyJ4= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1710645577; c=relaxed/simple; bh=6GZRy+YH48iOG1M1wG9wgUstBtx354GmcEumTulseAQ=; h=DKIM-Signature:Date:From:To:Subject:Message-ID:MIME-Version; b=IxDhKxvnQ/rDUvX6AYvMm96W/FBXSPPux/pEm7M4+JFe+OuABX4oAOCzXPW6iCjqQ+cqHs11yfZn93hcZtw2qJTPa0OuwEH4+7IWO8eWJxVxpqnhuKsrGe6waRGiEoZzTHmyImfYc2+dFAx0J80d8bhFJsPtzfwka4z2RuReWXw= ARC-Authentication-Results: i=1; server2.sourceware.org Received: by mail-pg1-x536.google.com with SMTP id 41be03b00d2f7-5c6bd3100fcso2028408a12.3 for ; Sat, 16 Mar 2024 20:19:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=fastly.com; s=google; t=1710645573; x=1711250373; darn=sourceware.org; h=in-reply-to:content-disposition:mime-version:references:message-id :subject:to:from:date:from:to:cc:subject:date:message-id:reply-to; bh=sqsUyektOlMOXxGPWDJKnN+sEHU8l0RRwgaFpJLVmYA=; b=guEcUAbPHeSyLACaQ7bzv0YxrZoGYD0nS+McAG3+UnxcslrOQZ1elZiTWUqWOvmrkx 1DlymE7VR8wtzn8s2rl2U3T3Rp9jVCQN8XvEtVBl2ZBFt99wMBS13rk16HmdCZ4TQRRW t8PEY7xpgyWlYZreKVuI/2o3nrR4Kr2mREDoI= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1710645573; x=1711250373; h=in-reply-to:content-disposition:mime-version:references:message-id :subject:to:from:date:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=sqsUyektOlMOXxGPWDJKnN+sEHU8l0RRwgaFpJLVmYA=; b=I6wGaJPb4Q3w2S4p6siw1JpxlA1DFxQ6ksyY9nMe09swgIyoB4FW7kRkUf0pUJTlRQ +yeaoEtGk+EIti8SJBIzyHMRLRl95TYS/4KLPC9P+8gIIKaCu7M7RNjo7SOcnruPMRQx Tut2ehT7l1cCwPwdy742BGOOeu0P22oDhUDNop1N5I37xBr4VbPKMVYvyVNRgz3+bT0t 1ObpQvy1Wvl4ONGsGgQQF5Mb7rwGeFYQXgpRrWvVBPMi4rOzYLlF9xid4615hR0q+/Zq YagaQ1ijb0R2FcDQc+dCpolytDxwJ35wMh4Y2bp5a4DayuSWUnK+/MjaCgP/vdxk5eg4 dF5g== X-Gm-Message-State: AOJu0Yy3gtohaZLJOjL8klg/6WT7H5PyDM0mU+eIFbfS9XDpcV93bn0W jNUg7P1B4wyyGd7x7E1H3EO/sfGcbqejNhqR9dcapApr1mpfam9L0nnFoYl35h8rd87g7HV2UlH sytcgk3w7n3JhQVluSfTsk52HQI2fm5IQYE9FBlfKyIhqX41jqGk/F9VsYnRnfqN97HlEL9Xhdg WSb/+rXTub/aUfhbcb2tEIA0iA/XNNAWiDsM67 X-Google-Smtp-Source: AGHT+IFfkAjtp5T14yYqg+ROkWy0ea6gmJjasSSeLZCcxMUIbY5hrm8PeyQyZI5ddVgrkZT5wkrENw== X-Received: by 2002:a17:902:ccc8:b0:1e0:f8:56a1 with SMTP id z8-20020a170902ccc800b001e000f856a1mr2439702ple.25.1710645573429; Sat, 16 Mar 2024 20:19:33 -0700 (PDT) Received: from feather.sobornost.net ([123.254.127.131]) by smtp.gmail.com with ESMTPSA id kw12-20020a170902f90c00b001dee1e0beddsm5641489plb.246.2024.03.16.20.19.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 16 Mar 2024 20:19:33 -0700 (PDT) Date: Sun, 17 Mar 2024 03:19:28 +0000 From: Job Snijders To: libc-alpha@sourceware.org Subject: Re: [PATCH] resolv: add IPv6 support to inet_net_pton() Message-ID: References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: X-Spam-Status: No, score=-3.4 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,RCVD_IN_DNSWL_NONE,SPAM_FROM,SPF_HELO_NONE,SPF_NONE,TXREP,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: Dear all, Slight tweaks compared to what I sent out earlier today: * for consistency use the __set_errno macro to set errno * preserve errno unless setting it explicitly (avoid errno stomping) Original message: On Sun, Mar 17, 2024 at 01:23:04AM +0000, Job Snijders wrote: > This is a refresh of a diff I proposed back in December 2022 to add IPv6 > support to inet_net_pton(). > > The starting point of this changeset was OpenBSD's > libc/net/inet_net_pton.c (r1.13) implementation of inet_net_pton_ipv6(). > https://cvsweb.openbsd.org/cgi-bin/cvsweb/src/lib/libc/net/inet_net_pton.c?annotate=1.13 > > The OpenBSD implementation was adapted to glibc as following: > > 1) Use strtol() instead of strtonum() > 2) Updated comments > > I've tested the changeset on Debian Bookworm. > > Your feedback is appreciated! Kind regards, Job Signed-off: Job Snijders --- resolv/inet_net_pton.c | 80 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 76 insertions(+), 4 deletions(-) diff --git a/resolv/inet_net_pton.c b/resolv/inet_net_pton.c index 63a47b7394..217e18263c 100644 --- a/resolv/inet_net_pton.c +++ b/resolv/inet_net_pton.c @@ -1,4 +1,6 @@ /* + * Copyright (c) 2024 Job Snijders + * Copyright (c) 2012 by Gilles Chehade * Copyright (c) 1996,1999 by Internet Software Consortium. * * Permission to use, copy, modify, and distribute this software for any @@ -35,13 +37,16 @@ static int inet_net_pton_ipv4 (const char *src, u_char *dst, size_t size) __THROW; +static int inet_net_pton_ipv6 (const char *src, u_char *dst, + size_t size) __THROW; /* - * static int + * int * inet_net_pton(af, src, dst, size) - * convert network number from presentation to network format. - * accepts hex octets, hex strings, decimal octets, and /CIDR. - * "size" is in bytes and describes "dst". + * Convert network number from presentation format to network format. + * If "af" is set to AF_INET, accept various formats like hex octets, + * hex strings, or decimal octets. If "af" is set to AF_INET6, accept + * IPv6 addresses. "size" is in bytes and describes "dst". * return: * number of bits, either imputed classfully or specified with /CIDR, * or -1 if some failure occurred (check errno). ENOENT means it was @@ -55,6 +60,8 @@ inet_net_pton (int af, const char *src, void *dst, size_t size) switch (af) { case AF_INET: return (inet_net_pton_ipv4(src, dst, size)); + case AF_INET6: + return (inet_net_pton_ipv6(src, dst, size)); default: __set_errno (EAFNOSUPPORT); return (-1); @@ -196,3 +203,68 @@ inet_net_pton_ipv4 (const char *src, u_char *dst, size_t size) __set_errno (EMSGSIZE); return (-1); } + + +/* + * Convert an IPv6 prefix from presentation format to network format. + * Return the number of bits specified, or -1 as error (check errno). + */ +static int +inet_net_pton_ipv6 (const char *src, u_char *dst, size_t size) +{ + struct in6_addr in6; + int bits, save_errno; + long lbits; + size_t bytes; + char buf[INET6_ADDRSTRLEN + sizeof("/128")]; + char *ep, *sep; + + save_errno = errno; + + if (strlcpy(buf, src, sizeof(buf)) >= sizeof(buf)) { + __set_errno (EMSGSIZE); + return (-1); + } + + sep = strchr(buf, '/'); + if (sep != NULL) + *sep++ = '\0'; + + if (inet_pton(AF_INET6, buf, &in6) != 1) { + __set_errno (ENOENT); + return (-1); + } + + if (sep == NULL) { + bits = 128; + goto out; + } + + if (sep[0] == '\0' || !isascii(sep[0]) || !isdigit(sep[0])) { + __set_errno (ENOENT); + return (-1); + } + + __set_errno (0); + lbits = strtol(sep, &ep, 10); + if (sep[0] == '\0' || *ep != '\0') { + __set_errno (ENOENT); + return (-1); + } + if ((errno == ERANGE && (lbits == LONG_MAX || lbits == LONG_MIN)) + || (lbits > 128 || lbits < 0)) { + __set_errno (EMSGSIZE); + return (-1); + } + bits = lbits; + + out: + bytes = (bits + 7) / 8; + if (bytes > size) { + __set_errno (EMSGSIZE); + return (-1); + } + __set_errno (save_errno); + memcpy(dst, &in6.s6_addr, bytes); + return (bits); +} -- 2.43.0