Received: by 2002:a6b:500f:0:0:0:0:0 with SMTP id e15csp1009203iob; Fri, 13 May 2022 19:28:03 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwXqSCIq2YvxMkUXqJ7skjmnxJzbhO0XLbJNC5PeDiU7mUhELlEPGENbPydCwvK/WmWdu6M X-Received: by 2002:a5d:6daa:0:b0:20c:6476:db2d with SMTP id u10-20020a5d6daa000000b0020c6476db2dmr5997864wrs.266.1652495283285; Fri, 13 May 2022 19:28:03 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1652495283; cv=none; d=google.com; s=arc-20160816; b=EIyaSFvZIj8FGb2rXpNkvClmv5yXwBowEmvd2Ty5cfCp5uA4gAVui1vrGyKml5uCoO +vQMGTMupxay1yw1beOj9M2nxOpdnTMSfbDOY+0DMW/CxOPxRA1Z8nYba+RmtoO+tS1E sichLj7SOXDSmbBPOKIvSimBZrfNAMhjPZmH6/aMSSbAwa0vT1mVBgbmTsH0k1FXtbfm r7b4sxS5CSPEQUwPVkfiQuHM7Vjd6RVq76nrpUr9Rf3zwKdXkT/hV5JUuYqZrfk8qb3x FCgJNl26xVsmXWPYxOs9EOb+t6dKEpCw1ErS1lBZLngSJXUR5Uts8CE8vqbpdU8n2Smu m9TA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=DZu1vGyRJvfMSB/s4tV6H7jpwGcGvBtFQ856IXndPcQ=; b=ERxKtG1rEqAsACaL4Fr+jttTQOzw1nPw0imYZIL2kJx66bjY7QaIXEG4giy/QLpGZ4 BamTswZx2cirDTmbZsz6knMs9PjPaFXpyW0bPedwtQWUN2lb2BgSi8tMDnTexCl6Fxyo fmvvxY6fpAvTJnGLr2dJyt5HKbg5G7Ui6JvluQ5+jJHV3WFLZMtgJaey/EeaGnHduP79 GGC9m+osxusvCK404588iSTW3FAoXa0k+lRIVLKQPm5xScGYhh6fvrBFWACjN1pFYi9c jjbsiF/A9WzDKGk0KE6dIwiaxN5QS+CaQa0v1QyMfx7qRCJJy9+neVD7yK45hkxsyc8A vb6Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20210112 header.b=ivSAc5Ss; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from lindbergh.monkeyblade.net (lindbergh.monkeyblade.net. [2620:137:e000::1:18]) by mx.google.com with ESMTPS id o13-20020a5d47cd000000b0020ab848bacesi5034605wrc.504.2022.05.13.19.28.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 13 May 2022 19:28:03 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) client-ip=2620:137:e000::1:18; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20210112 header.b=ivSAc5Ss; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 9AF9D310704; Fri, 13 May 2022 17:42:36 -0700 (PDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1350941AbiEMP1G (ORCPT + 99 others); Fri, 13 May 2022 11:27:06 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54096 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1381973AbiEMP0v (ORCPT ); Fri, 13 May 2022 11:26:51 -0400 Received: from mail-ej1-x62b.google.com (mail-ej1-x62b.google.com [IPv6:2a00:1450:4864:20::62b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 799AA1EAC6; Fri, 13 May 2022 08:26:50 -0700 (PDT) Received: by mail-ej1-x62b.google.com with SMTP id ks9so16963943ejb.2; Fri, 13 May 2022 08:26:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=DZu1vGyRJvfMSB/s4tV6H7jpwGcGvBtFQ856IXndPcQ=; b=ivSAc5Ss+bwVCXF2o/taX96YkXq4gte9BeFc7Rg2VFgcIsWH0dGBSYhGIygnmoPm4i XBFXk7J3W6zhPuPpUWYCL8lwFoA4nfiUY30cKBtVylzK1kkhMv18WLHqE82jA1e6fzkD ONRqucgLp/mzwCtmbW9+dby4B2iget/2OY4gm/m2QTysSpMNG0Qt+yVYbfqS06tATnW5 rA4a9hT2t4ff73cnRLegbL0FrxjSpwkYJDhahPtQ3mp6IlD31fS6vrrRbY6spahqUQPp wAEGmI72MBVrYd0A/KrQQ+GyQgMXqd8NLJZkkyXu9Yq+8R4RkwtXaT6GOrLhyL7q/JBo UTwg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=DZu1vGyRJvfMSB/s4tV6H7jpwGcGvBtFQ856IXndPcQ=; b=BlwXdJ4n3zVlgvEgdw37d26MVuVoLBCVI8ZuSQIp4wb85Mew3ECjMHC46MPnXP8On+ us6gSh8D2wX80b05XG9q+VNgbmQM9+K+oVctnke94S3vaLZuPElNEwjPQwLYwjwhaVkK V9jw9pfc1alMzcRBBO71QKiTShDESgvEWoVBrB/IW71mlsylvimgV30wF26gjArynPoe w6RPW4LvAkaNnYo/Uk07FMwK46apcZT9FOM21nR6r6u6sE+5GLfwbhhrcyZIWxIiYa/y WgBCYwguSdEaosnfL+fCPAuqmqCX6aSE1wx7Jj3McevXNh+rE7MmDKcCnPwqIJ+jRDft SvUg== X-Gm-Message-State: AOAM533NcA2Y5B6DJiRdG7McIC8RzOqz7Z076VaoN5Sbq9t8ZVRnjhLM eVXPk78KfVMkW3otPbjze7bbtT5kUH8= X-Received: by 2002:a17:907:960d:b0:6f4:3b68:8d55 with SMTP id gb13-20020a170907960d00b006f43b688d55mr4671925ejc.105.1652455608549; Fri, 13 May 2022 08:26:48 -0700 (PDT) Received: from 127.0.0.1localhost ([185.69.144.161]) by smtp.gmail.com with ESMTPSA id j13-20020a508a8d000000b0042617ba63cbsm1015351edj.85.2022.05.13.08.26.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 13 May 2022 08:26:48 -0700 (PDT) From: Pavel Begunkov To: netdev@vger.kernel.org, "David S . Miller" , Jakub Kicinski , Paolo Abeni Cc: David Ahern , Eric Dumazet , linux-kernel@vger.kernel.org, Pavel Begunkov Subject: [PATCH net-next v3 02/10] udp/ipv6: move pending section of udpv6_sendmsg Date: Fri, 13 May 2022 16:26:07 +0100 Message-Id: X-Mailer: git-send-email 2.36.0 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,RDNS_NONE, SPF_HELO_NONE,T_SCC_BODY_TEXT_LINE autolearn=no autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Move up->pending section of udpv6_sendmsg() to the beginning of the function. Even though it require some code duplication for sin6 parsing, it clearly localises the pending handling in one place, removes an extra if and more importantly will prepare the code for further patches. Signed-off-by: Pavel Begunkov --- net/ipv6/udp.c | 70 ++++++++++++++++++++++++++++++-------------------- 1 file changed, 42 insertions(+), 28 deletions(-) diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c index 11d44ed46953..85bff1252f5c 100644 --- a/net/ipv6/udp.c +++ b/net/ipv6/udp.c @@ -1318,6 +1318,46 @@ int udpv6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) ipc6.sockc.tsflags = sk->sk_tsflags; ipc6.sockc.mark = sk->sk_mark; + /* Rough check on arithmetic overflow, + better check is made in ip6_append_data(). + */ + if (unlikely(len > INT_MAX - sizeof(struct udphdr))) + return -EMSGSIZE; + + getfrag = is_udplite ? udplite_getfrag : ip_generic_getfrag; + + /* There are pending frames. */ + if (up->pending) { + if (up->pending == AF_INET) + return udp_sendmsg(sk, msg, len); + + /* Do a quick destination sanity check before corking. */ + if (sin6) { + if (msg->msg_namelen < offsetof(struct sockaddr, sa_data)) + return -EINVAL; + if (sin6->sin6_family == AF_INET6) { + if (msg->msg_namelen < SIN6_LEN_RFC2133) + return -EINVAL; + if (ipv6_addr_any(&sin6->sin6_addr) && + ipv6_addr_v4mapped(&np->saddr)) + return -EINVAL; + } else if (sin6->sin6_family != AF_UNSPEC) { + return -EINVAL; + } + } + + /* The socket lock must be held while it's corked. */ + lock_sock(sk); + if (unlikely(up->pending != AF_INET6)) { + /* Just now it was seen corked, userspace is buggy */ + err = up->pending ? -EAFNOSUPPORT : -EINVAL; + release_sock(sk); + return err; + } + dst = NULL; + goto do_append_data; + } + /* destination address check */ if (sin6) { if (addr_len < offsetof(struct sockaddr, sa_data)) @@ -1343,12 +1383,11 @@ int udpv6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) default: return -EINVAL; } - } else if (!up->pending) { + } else { if (sk->sk_state != TCP_ESTABLISHED) return -EDESTADDRREQ; daddr = &sk->sk_v6_daddr; - } else - daddr = NULL; + } if (daddr) { if (ipv6_addr_v4mapped(daddr)) { @@ -1365,31 +1404,6 @@ int udpv6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) } } - /* Rough check on arithmetic overflow, - better check is made in ip6_append_data(). - */ - if (len > INT_MAX - sizeof(struct udphdr)) - return -EMSGSIZE; - - getfrag = is_udplite ? udplite_getfrag : ip_generic_getfrag; - if (up->pending) { - if (up->pending == AF_INET) - return udp_sendmsg(sk, msg, len); - /* - * There are pending frames. - * The socket lock must be held while it's corked. - */ - lock_sock(sk); - if (likely(up->pending)) { - if (unlikely(up->pending != AF_INET6)) { - release_sock(sk); - return -EAFNOSUPPORT; - } - dst = NULL; - goto do_append_data; - } - release_sock(sk); - } ulen += sizeof(struct udphdr); memset(fl6, 0, sizeof(*fl6)); -- 2.36.0