Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp3925957pxb; Mon, 1 Feb 2021 08:07:18 -0800 (PST) X-Google-Smtp-Source: ABdhPJxZ7KLj9gq4P3QEkND6nkixzTv+AZcuzh1WysyA5ZK8079rkLfXbWIquzJdJ5rQKXURY1bK X-Received: by 2002:aa7:c719:: with SMTP id i25mr19746881edq.197.1612195637893; Mon, 01 Feb 2021 08:07:17 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1612195637; cv=none; d=google.com; s=arc-20160816; b=RGYVq3yny/uUdYBlX0aReUE3m2dFGZOCymuCiuArcodFEWD1a3BwZMOjX+bLImVKzv uepyM6wSk2qn0yuIRXvbEUHiN8wiJfEPfE9L10ZqbWqJtWYJdaFnkVlYGP/OzBKArdDh 5xpv6oiAkMdv8XVB+8vc9ucJmM6q1bwpTqLjmPg7wn4I6TxGqMb82+fByIoZLq0zRydy XUMC/cAF0CdjTbJTPyv3nIYnzvlUam+L5sNu+pRGPPRBsR7tGZLcjhnd3fflll/ZwvDs UkOw9RxUuGGragaRUrIMD5Z3D1tuy6thOvzN3pTZU8Wa6HtVf4iBpNnTjgGx7UEwDb5Z YOEA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:from:subject:mime-version:message-id:date :sender:dkim-signature; bh=k0C1xWSejIoCUIkR3Xdpp2QfnBoYRRN5HyYkZB6dBTA=; b=U8HeKATASpjWEz1xeQ2SBERiqj7vLhGJ0yFdHfTbYpjCJG+BCL6GCrvgFaBWl8uC0Z iuPmzP+RS2s/OaxkUJg72DrfD/cBpX682XC6pupPr2iOHscB1Pw0KPuGwIt5bKcJ5W/s DchAfC8K68GKGV/nJxHLK+zzMPE/go2d4XSaZgWjzuO+dKWK9cPuigX5ZYcs0lgfB1fj +M6gwPpKK4IPC18v0p0SH/r++iMwmdIHd4Ao4nitQpPeDHZ7GgKMWxuVDy1D372mlJCA SLHsK79SmyGs/Wyj1bCgPKjso2YgcyAk8h6rdegLuBioPC6LrOVfclAVTdULBgLzunY4 vDqw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=NepNoYaS; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id dg12si11094534edb.439.2021.02.01.08.06.52; Mon, 01 Feb 2021 08:07:17 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=NepNoYaS; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230038AbhBAQFg (ORCPT + 99 others); Mon, 1 Feb 2021 11:05:36 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49326 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229696AbhBAQF1 (ORCPT ); Mon, 1 Feb 2021 11:05:27 -0500 Received: from mail-wm1-x34a.google.com (mail-wm1-x34a.google.com [IPv6:2a00:1450:4864:20::34a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C2F20C061573 for ; Mon, 1 Feb 2021 08:04:46 -0800 (PST) Received: by mail-wm1-x34a.google.com with SMTP id y9so5014515wmi.8 for ; Mon, 01 Feb 2021 08:04:46 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=sender:date:message-id:mime-version:subject:from:to:cc; bh=k0C1xWSejIoCUIkR3Xdpp2QfnBoYRRN5HyYkZB6dBTA=; b=NepNoYaSqyIEMzp6Df1/nXS4fC6aPClhYVE07/UQ8P/TA/6hzQq8i4FI1xSSiIMehd JBC4glTTbdqOCO/siFNbS2TTeBHRfWbLk2zqwrl88bzHvv2xfjxmFD5zNrDfFHnnmliK LyYwHowk9nqaJAWtjk0M7k5kGcTTCrvW6oN/+mG/pJHIISh7b/el2cPEP75uvJo2Bmyh IJf28vVsat0mk2unsmH4O/0QG2kWQWtgIAHMrkmmcNmMhKvj+XKzNS3aZSVDOBSUVAeQ NQMBdGPGBnbBnc9Vqzrbrrhq2PBnRwkJfvi34kcKwjrNey1eftKXLGNGt6re4wvO40mD Q4vQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:date:message-id:mime-version:subject:from :to:cc; bh=k0C1xWSejIoCUIkR3Xdpp2QfnBoYRRN5HyYkZB6dBTA=; b=YsB9OK7rdVGn2svGG3xhrMM1hiHZxiIIOp3XIAngm+lqA1LqE2Ayg282I8HJ9nReZq bc0FHVbBwA2ik/UbIjJIeEyrJgAt3ELOxBae+hIkb+CEDZa/Q61DGxbtgVi7wDQjzrP6 Fh7PKXIVpyrtewsLBGLI7ZOQPmSWiHQEAKgqwOL6lnBkf1uGjunMIVKsGw65aR6TUPIz 6GMtuqi3BkC0x8kcrX7TBOEQcvmUf4Z5kxgajNXgbEuPBqdIyY8nT3om6OCRE4JaUAoE D6xszrSc5Gt+L89Mc/DvhAEiiQsSJZygqcHqLxr2XIG0y2geZ5GZTr+pD5Ho6p+IPmlN 3hog== X-Gm-Message-State: AOAM532tEj2pnfrbpMBavDKsMesYzEcoIlgHblkJ0kxhNPt5qus98rtF nC3KV8IWMZMDPYNqQxASjJYDoQA2Aw== Sender: "elver via sendgmr" X-Received: from elver.muc.corp.google.com ([2a00:79e0:15:13:f693:9fff:fef4:2449]) (user=elver job=sendgmr) by 2002:a7b:c76e:: with SMTP id x14mr2587288wmk.17.1612195485394; Mon, 01 Feb 2021 08:04:45 -0800 (PST) Date: Mon, 1 Feb 2021 17:04:20 +0100 Message-Id: <20210201160420.2826895-1-elver@google.com> Mime-Version: 1.0 X-Mailer: git-send-email 2.30.0.365.g02bc693789-goog Subject: [PATCH net-next] net: fix up truesize of cloned skb in skb_prepare_for_shift() From: Marco Elver To: elver@google.com Cc: linux-kernel@vger.kernel.org, kasan-dev@googlegroups.com, davem@davemloft.net, kuba@kernel.org, jonathan.lemon@gmail.com, willemb@google.com, linmiaohe@huawei.com, gnault@redhat.com, dseok.yi@samsung.com, kyk.segfault@gmail.com, viro@zeniv.linux.org.uk, netdev@vger.kernel.org, glider@google.com, syzbot+7b99aafdcc2eedea6178@syzkaller.appspotmail.com, Eric Dumazet Content-Type: text/plain; charset="UTF-8" Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Avoid the assumption that ksize(kmalloc(S)) == ksize(kmalloc(S)): when cloning an skb, save and restore truesize after pskb_expand_head(). This can occur if the allocator decides to service an allocation of the same size differently (e.g. use a different size class, or pass the allocation on to KFENCE). Because truesize is used for bookkeeping (such as sk_wmem_queued), a modified truesize of a cloned skb may result in corrupt bookkeeping and relevant warnings (such as in sk_stream_kill_queues()). Link: https://lkml.kernel.org/r/X9JR/J6dMMOy1obu@elver.google.com Reported-by: syzbot+7b99aafdcc2eedea6178@syzkaller.appspotmail.com Suggested-by: Eric Dumazet Signed-off-by: Marco Elver --- net/core/skbuff.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/net/core/skbuff.c b/net/core/skbuff.c index 2af12f7e170c..3787093239f5 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c @@ -3289,7 +3289,19 @@ EXPORT_SYMBOL(skb_split); */ static int skb_prepare_for_shift(struct sk_buff *skb) { - return skb_cloned(skb) && pskb_expand_head(skb, 0, 0, GFP_ATOMIC); + int ret = 0; + + if (skb_cloned(skb)) { + /* Save and restore truesize: pskb_expand_head() may reallocate + * memory where ksize(kmalloc(S)) != ksize(kmalloc(S)), but we + * cannot change truesize at this point. + */ + unsigned int save_truesize = skb->truesize; + + ret = pskb_expand_head(skb, 0, 0, GFP_ATOMIC); + skb->truesize = save_truesize; + } + return ret; } /** base-commit: 14e8e0f6008865d823a8184a276702a6c3cbef3d -- 2.30.0.365.g02bc693789-goog