From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-ej1-x634.google.com (mail-ej1-x634.google.com [IPv6:2a00:1450:4864:20::634]) by sourceware.org (Postfix) with ESMTPS id A2213385840E for ; Mon, 25 Mar 2024 09:04:55 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org A2213385840E 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 A2213385840E Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2a00:1450:4864:20::634 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1711357506; cv=none; b=H4KVfEkz76HYjFOVcg6eAddaw0hTc3MFvQmuXDm71zPJzwhpuqsHU+E17b94+xz3p3M83inl57Zphwfk4iQhXLzZ4qmQceNBHrnefuSkY4aRIvSyDdoS4q0LtMH9P0sFNCj0WiiKGANjHWmdXpnNjhxt2liHBdU4o25J6AACeww= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1711357506; c=relaxed/simple; bh=H1wudC7N07N8gkOAImIR0TvU8nb/H3zJ606bqYWlmiU=; h=DKIM-Signature:Date:From:To:Subject:Message-ID:MIME-Version; b=MbtpZxF1LQCgWWy3sQX+TZbj65Ez4ERZLO4f7DEjIBY8nV7/QX1RhpmRWRL5n2dP8hwc1QV8xr/DT/fCvAijzqv49RqkE8CmIMXC8xqYDaxYz4FSJErPTDM3XWCezun5ByqGSd8H+Y0ojlxC9lxkZ1tcftK7Jq7KvCUC0HSE2P8= ARC-Authentication-Results: i=1; server2.sourceware.org Received: by mail-ej1-x634.google.com with SMTP id a640c23a62f3a-a46d0a8399aso855664866b.1 for ; Mon, 25 Mar 2024 02:04:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=fastly.com; s=google; t=1711357494; x=1711962294; darn=sourceware.org; h=in-reply-to:content-disposition:mime-version:references:message-id :subject:cc:to:from:date:from:to:cc:subject:date:message-id:reply-to; bh=UJGp592Qc/Pm93iA9AsSCd7IM457vhU0VDtyNSRUQnc=; b=RO4jJZipFSyBvaO+nc2+RAWVBoqKEmeHlmju0g/rR+TljZ/kwdRu6TC0+b2wJ/FV6f hr8Ojn5PSbh9SvjbTcDhveSKeaxR/xcikIPAoWDQ4zy9P4SaV+qZnuypEgCNj+elgIc/ NqTcyPi3ELuQR2yduzOsulBcxjX4jNXFyzzi8= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1711357494; x=1711962294; h=in-reply-to:content-disposition:mime-version:references:message-id :subject:cc:to:from:date:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=UJGp592Qc/Pm93iA9AsSCd7IM457vhU0VDtyNSRUQnc=; b=npdDh1OBq7cCd2PSM04YzuOxciOk1eBAEpS+L7hafLS3dlPNa4ITdMna3BA0ANtSty TB1DQOKFEJs3RCeW0sSKnTlddHuYQ7uodUvKSpyz3KLpy/p5DYlCnhaIEqFJ7B4nCv7A VJPFKL6N6Tuqz7KAyKtx27Q0Pei606sPRdnB4mDJnwnQ6YW6Ge8/kyHdfZ3GmYknFN2g 9mQ2zJtgFPUeGKs/f4nuVWH16aZuJsodhr83Z47eZhCrk08FD42o3UlR3isvbSj1vHeI 4+bEwzzvneYUuvCACfu7iKS1On9jM3vRItmkLepkPP8x9i0IhDmoNOLPWlvjaORnbHyG W5vw== X-Forwarded-Encrypted: i=1; AJvYcCX/bapQU5BFrMU+DgTZckUUg2jClZIW67ca2eHOs8nclP6sILgjd4/q3+c9sLjRQR/lA/hIY+Alm+hArYhYSD9CoLmbAoJGeJA1 X-Gm-Message-State: AOJu0YwK8EZiA3PnYLeRUbTcqzhiKKLDl4srYrNXvs06wjVMNdRTgzPq /vfO/XKUScpijaS0X/xIDOYWrP6EycTBnVght8kwSaJAFyrZXtU/EgnjQv0Yi8M= X-Google-Smtp-Source: AGHT+IFopylcMSCbQBR0EwgsWt0pm8DkBixmDCHHeuv92V5tIESnK4zzRfdzigYLAyv1cf0LewdWtA== X-Received: by 2002:a17:906:f8d0:b0:a46:d759:d531 with SMTP id lh16-20020a170906f8d000b00a46d759d531mr4974074ejb.34.1711357494316; Mon, 25 Mar 2024 02:04:54 -0700 (PDT) Received: from feather.sobornost.net (guest41.guestnet.ripe.net. [193.0.10.72]) by smtp.gmail.com with ESMTPSA id bu24-20020a170906a15800b00a46a2779475sm2820866ejb.101.2024.03.25.02.04.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 25 Mar 2024 02:04:53 -0700 (PDT) Date: Mon, 25 Mar 2024 09:04:52 +0000 From: Job Snijders To: Zack Weinberg Cc: Andreas Schwab , Florian Weimer , GNU libc development Subject: Re: [PATCH] resolv: add IPv6 support to inet_net_pton() Message-ID: References: <87zfuxcdjd.fsf@oldenburg.str.redhat.com> <3f50bd26-9199-4174-9fde-8f890651f48e@app.fastmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <3f50bd26-9199-4174-9fde-8f890651f48e@app.fastmail.com> X-Spam-Status: No, score=-2.5 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 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 Zack, On Fri, Mar 22, 2024 at 10:24:35AM -0400, Zack Weinberg wrote: > Please change that to "ep == sep", even if you make no other changes. > > Anyway, I would have written this as > > lbits = strtol(sep, &ep, 10); > if (ep == sep || *ep != '\0') { > __set_errno(ENOENT); > return -1; > } > if (lbits < 0 || lbits > 128) { > __set_errno(EMSGSIZE); > return -1; > } > > and I do think this is an improvement over what you had, largely > because it eliminates the need to save and restore the original value > of errno. Thank you for your response, I've adjusted the proposal according to your notes. Kind regards, Job Signed-off: Job Snijders --- resolv/inet_net_pton.c | 69 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 65 insertions(+), 4 deletions(-) diff --git a/resolv/inet_net_pton.c b/resolv/inet_net_pton.c index 63a47b7394..93753cb37f 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 @@ -19,6 +21,7 @@ #include #include #include +#include #include #include @@ -35,13 +38,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 +61,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 +204,56 @@ 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; + long lbits; + size_t bytes; + char *ep, *sep; + + sep = strchr(src, '/'); + + if (__inet_pton_length(AF_INET6, src, sep ? sep - src : strlen(src), + &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); + } + + lbits = strtol(sep, &ep, 10); + if (ep == sep || *ep != '\0') { + __set_errno (ENOENT); + return (-1); + } + if (lbits < 0 || lbits > 128) { + __set_errno (EMSGSIZE); + return (-1); + } + bits = lbits; + + out: + bytes = (bits + 7) / 8; + if (bytes > size) { + __set_errno (EMSGSIZE); + return (-1); + } + memcpy(dst, &in6.s6_addr, bytes); + return (bits); +}