Received: by 2002:a05:6a10:206:0:0:0:0 with SMTP id 6csp2697065pxj; Mon, 31 May 2021 08:29:53 -0700 (PDT) X-Google-Smtp-Source: ABdhPJz9s4N0SeP/SF4XKgkZluoJHYg0oKSTLd239Lbr62ceS0BrVoRe/5htHG81NVKjOOLSMWtc X-Received: by 2002:a17:906:6d45:: with SMTP id a5mr4413655ejt.399.1622474993370; Mon, 31 May 2021 08:29:53 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1622474993; cv=none; d=google.com; s=arc-20160816; b=yKqyKbBgeBtR3kUt9kLt3j//Fx6a8cS/v9G+y50Bq8e+gFv+TLkdPT7U1QoOjDv5MZ L0HAy4ncTSSXi2nIeZAgZ+F6s6xQmJJalJ+1rd0/uc51dS8UiqXjJjHXSTkunnTLtCgx uAbCPEDDin6kS7MlhmatXWnGVnAAPK9KU0LUyVdDKapOdAYcvkuPFFkyIxRUymDr06KD znwfLSwU3kjY0ErqdH9BxmWeQLXaobcNco0181O/6fITLujZNa4wKBr42XovQMNLu77T Dk0OWR4y78IGUwVT0eQzoyVZcvJTZb4uCL/8hM6GlDkqvAo30/bgwPAFRn3MgUv5qcX4 0zxw== 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 :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=GZ0WDl2kGkAkPZo/GylNYGZVZep5/1IQ+DcPkL8+UYI=; b=atibUb4OCnW3cjuK5s+pdx35yPJezZNAHsfCsmHBkgH9VjD3s91W/XDKtFMNE4Wxxq rYf+yg78Muxe4sNuPzfOOy30N4XBrYdJ9ndS4Ulen9O5uWfQMnJQn+qiKrFjLCQrnh90 cp7QxmZ3Prkw69zt8oEy1ywKe8tESYoxGAUGlmDVTGP8LavLBfeP7XclrHC85JuRlpZK 75nirbuW/oFG5NU/x4DtlY5F3JDxH5BJYkm53HN6laewK+nQoQ3DBzOwtDv7/L4bxkts KzPKg2xuX6+RJO0tTmOMhSwTErOzx1Pp5vXJMzT/XZtIIK2NnjF5J1IMCFrzCHdZHkgq qP7w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=k9GYcn8B; 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=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id t2si13016368ejf.594.2021.05.31.08.29.30; Mon, 31 May 2021 08:29:53 -0700 (PDT) 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=@linuxfoundation.org header.s=korg header.b=k9GYcn8B; 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=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234759AbhEaP2H (ORCPT + 99 others); Mon, 31 May 2021 11:28:07 -0400 Received: from mail.kernel.org ([198.145.29.99]:43970 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233486AbhEaOTI (ORCPT ); Mon, 31 May 2021 10:19:08 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 8DBB8619B6; Mon, 31 May 2021 13:44:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1622468664; bh=7QXqn94zqFD8tTPdbHgKtZQt7uJTtmRjqr/4mq2F30k=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=k9GYcn8B2PbSYqDLvdi5yWOJv0iqXaBMlW29bdaqeVLiuxOGD1JmQi4dC06FqTonj fGFd9qAJE0EkgoYEQ9tzkygjD0DL5DIce0KqLsUcWL0pxrLGExFKd2hpOr0HKYsa87 IDdNjURaFcfRHmm6FyAryIW+0AG2XpBw1QViZVG0= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Li Shuang , Xin Long , Jon Maloy , "David S. Miller" Subject: [PATCH 5.4 077/177] tipc: skb_linearize the head skb when reassembling msgs Date: Mon, 31 May 2021 15:13:54 +0200 Message-Id: <20210531130650.556523855@linuxfoundation.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210531130647.887605866@linuxfoundation.org> References: <20210531130647.887605866@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Xin Long commit b7df21cf1b79ab7026f545e7bf837bd5750ac026 upstream. It's not a good idea to append the frag skb to a skb's frag_list if the frag_list already has skbs from elsewhere, such as this skb was created by pskb_copy() where the frag_list was cloned (all the skbs in it were skb_get'ed) and shared by multiple skbs. However, the new appended frag skb should have been only seen by the current skb. Otherwise, it will cause use after free crashes as this appended frag skb are seen by multiple skbs but it only got skb_get called once. The same thing happens with a skb updated by pskb_may_pull() with a skb_cloned skb. Li Shuang has reported quite a few crashes caused by this when doing testing over macvlan devices: [] kernel BUG at net/core/skbuff.c:1970! [] Call Trace: [] skb_clone+0x4d/0xb0 [] macvlan_broadcast+0xd8/0x160 [macvlan] [] macvlan_process_broadcast+0x148/0x150 [macvlan] [] process_one_work+0x1a7/0x360 [] worker_thread+0x30/0x390 [] kernel BUG at mm/usercopy.c:102! [] Call Trace: [] __check_heap_object+0xd3/0x100 [] __check_object_size+0xff/0x16b [] simple_copy_to_iter+0x1c/0x30 [] __skb_datagram_iter+0x7d/0x310 [] __skb_datagram_iter+0x2a5/0x310 [] skb_copy_datagram_iter+0x3b/0x90 [] tipc_recvmsg+0x14a/0x3a0 [tipc] [] ____sys_recvmsg+0x91/0x150 [] ___sys_recvmsg+0x7b/0xc0 [] kernel BUG at mm/slub.c:305! [] Call Trace: [] [] kmem_cache_free+0x3ff/0x400 [] __netif_receive_skb_core+0x12c/0xc40 [] ? kmem_cache_alloc+0x12e/0x270 [] netif_receive_skb_internal+0x3d/0xb0 [] ? get_rx_page_info+0x8e/0xa0 [be2net] [] be_poll+0x6ef/0xd00 [be2net] [] ? irq_exit+0x4f/0x100 [] net_rx_action+0x149/0x3b0 ... This patch is to fix it by linearizing the head skb if it has frag_list set in tipc_buf_append(). Note that we choose to do this before calling skb_unshare(), as __skb_linearize() will avoid skb_copy(). Also, we can not just drop the frag_list either as the early time. Fixes: 45c8b7b175ce ("tipc: allow non-linear first fragment buffer") Reported-by: Li Shuang Signed-off-by: Xin Long Acked-by: Jon Maloy Signed-off-by: David S. Miller Signed-off-by: Greg Kroah-Hartman --- net/tipc/msg.c | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) --- a/net/tipc/msg.c +++ b/net/tipc/msg.c @@ -141,18 +141,13 @@ int tipc_buf_append(struct sk_buff **hea if (unlikely(head)) goto err; *buf = NULL; + if (skb_has_frag_list(frag) && __skb_linearize(frag)) + goto err; frag = skb_unshare(frag, GFP_ATOMIC); if (unlikely(!frag)) goto err; head = *headbuf = frag; TIPC_SKB_CB(head)->tail = NULL; - if (skb_is_nonlinear(head)) { - skb_walk_frags(head, tail) { - TIPC_SKB_CB(head)->tail = tail; - } - } else { - skb_frag_list_init(head); - } return 0; }