Received: by 2002:a25:1985:0:0:0:0:0 with SMTP id 127csp3686001ybz; Mon, 20 Apr 2020 07:39:17 -0700 (PDT) X-Google-Smtp-Source: APiQypIxcUCUb00xd9cPxVbUWUYP/aSL4pcvg0ZcH60ADyi/2DRZp9c2Dt+p3brUApjq+bxxDF7X X-Received: by 2002:a17:906:8609:: with SMTP id o9mr16697847ejx.361.1587393557077; Mon, 20 Apr 2020 07:39:17 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1587393557; cv=none; d=google.com; s=arc-20160816; b=rCGNp1iX3gu8dLpVfBjiNHofsEpif0nLwONnJwT+59owvSZ0IspsErlT10BFricENy N7yiiOMc4Vb0hee1PodvFIol+F+0TEglPrQeRVWTRgYQyNF8iiRvWTxSD/hDcFzCgchb Z8IU1J3PXTq4jhOdRHU/F5Cpcc4NzNjWuJdtPQzEbaDZLPRxeKlmhfBs3F8Xbxs6Gr2Y iEZK3XIBWGPvYS05Npdro8/YQqcv25lc1s9G0Kew/ht5cCgN78TDFNwJvbS60ByLRlb/ s56lBflWtvCooJb48NNRgxxC9+1uq/pGkto2+jBTSfsktRDP3k9gBya8e/VbjE6LAa2O /31Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=SVdRRxnUZnOfnmbFkPZhDVGRF+1TA+9PSgR37Wo8gk8=; b=STW72OqNziltya5OvXWF8wmNvJe/Sw/2DJp0/9qCQAnvSkoFoNh+dx5bzVLcfrdYrj JJ/Z6zYsAsj2lz+zkZqmR2l06ZcMKVwx5hYee4PFPP4VcEPm6qtKofie9dA5pBEjNBuL lPEcNvCk41o7ZF2wzYhVReFvUNEE8uQLvkdVH0hfYfCwoMVAoFpPDU/BwQ2DE/qEALPY 1FIKCEB7gXlbuNSEIWGGsuicj0NJqEtSdh4PWdwgJa13anzjAGKS+A4MuYaTM61SguvN 8Wk1cwjfpOgR0A4Jl8T2NC5cXjJdnY5Ql5p+JOhZz5pDs8MKFCQd7HVsEJey4WyUU7cH d3MQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=AIjXbkGW; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id p5si659317edd.313.2020.04.20.07.38.53; Mon, 20 Apr 2020 07:39:17 -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=@kernel.org header.s=default header.b=AIjXbkGW; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729735AbgDTM7m (ORCPT + 99 others); Mon, 20 Apr 2020 08:59:42 -0400 Received: from mail.kernel.org ([198.145.29.99]:33982 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727997AbgDTMlT (ORCPT ); Mon, 20 Apr 2020 08:41:19 -0400 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id D03FC206D4; Mon, 20 Apr 2020 12:41:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1587386479; bh=w2SkFmHo/Ut+jRMaAS5GKrDYHKTgFsE/O5mcLf2r7iY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=AIjXbkGWZu6/nqBQtCcPWoYE29pMenzQha6XdfdfxpiWhG1b36Sz6rVhkufzlhvlq nZiEtZ3QVvHpA9Kl/Ni4FSLD5JDVz2jWBepXqjTajaoaD0C5ZL/DUFeuK7JMJKSAL/ /J3/cwy9nfLEv5MOyx2OtCYEvtnCl30B25nwrELA= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Taras Chornyi , Vadym Kochan , "David S. Miller" Subject: [PATCH 5.5 05/65] net: ipv4: devinet: Fix crash when add/del multicast IP with autojoin Date: Mon, 20 Apr 2020 14:38:09 +0200 Message-Id: <20200420121507.894571396@linuxfoundation.org> X-Mailer: git-send-email 2.26.1 In-Reply-To: <20200420121505.909671922@linuxfoundation.org> References: <20200420121505.909671922@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Taras Chornyi [ Upstream commit 690cc86321eb9bcee371710252742fb16fe96824 ] When CONFIG_IP_MULTICAST is not set and multicast ip is added to the device with autojoin flag or when multicast ip is deleted kernel will crash. steps to reproduce: ip addr add 224.0.0.0/32 dev eth0 ip addr del 224.0.0.0/32 dev eth0 or ip addr add 224.0.0.0/32 dev eth0 autojoin Unable to handle kernel NULL pointer dereference at virtual address 0000000000000088 pc : _raw_write_lock_irqsave+0x1e0/0x2ac lr : lock_sock_nested+0x1c/0x60 Call trace: _raw_write_lock_irqsave+0x1e0/0x2ac lock_sock_nested+0x1c/0x60 ip_mc_config.isra.28+0x50/0xe0 inet_rtm_deladdr+0x1a8/0x1f0 rtnetlink_rcv_msg+0x120/0x350 netlink_rcv_skb+0x58/0x120 rtnetlink_rcv+0x14/0x20 netlink_unicast+0x1b8/0x270 netlink_sendmsg+0x1a0/0x3b0 ____sys_sendmsg+0x248/0x290 ___sys_sendmsg+0x80/0xc0 __sys_sendmsg+0x68/0xc0 __arm64_sys_sendmsg+0x20/0x30 el0_svc_common.constprop.2+0x88/0x150 do_el0_svc+0x20/0x80 el0_sync_handler+0x118/0x190 el0_sync+0x140/0x180 Fixes: 93a714d6b53d ("multicast: Extend ip address command to enable multicast group join/leave on") Signed-off-by: Taras Chornyi Signed-off-by: Vadym Kochan Signed-off-by: David S. Miller Signed-off-by: Greg Kroah-Hartman --- net/ipv4/devinet.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) --- a/net/ipv4/devinet.c +++ b/net/ipv4/devinet.c @@ -614,12 +614,15 @@ struct in_ifaddr *inet_ifa_byprefix(stru return NULL; } -static int ip_mc_config(struct sock *sk, bool join, const struct in_ifaddr *ifa) +static int ip_mc_autojoin_config(struct net *net, bool join, + const struct in_ifaddr *ifa) { +#if defined(CONFIG_IP_MULTICAST) struct ip_mreqn mreq = { .imr_multiaddr.s_addr = ifa->ifa_address, .imr_ifindex = ifa->ifa_dev->dev->ifindex, }; + struct sock *sk = net->ipv4.mc_autojoin_sk; int ret; ASSERT_RTNL(); @@ -632,6 +635,9 @@ static int ip_mc_config(struct sock *sk, release_sock(sk); return ret; +#else + return -EOPNOTSUPP; +#endif } static int inet_rtm_deladdr(struct sk_buff *skb, struct nlmsghdr *nlh, @@ -675,7 +681,7 @@ static int inet_rtm_deladdr(struct sk_bu continue; if (ipv4_is_multicast(ifa->ifa_address)) - ip_mc_config(net->ipv4.mc_autojoin_sk, false, ifa); + ip_mc_autojoin_config(net, false, ifa); __inet_del_ifa(in_dev, ifap, 1, nlh, NETLINK_CB(skb).portid); return 0; } @@ -940,8 +946,7 @@ static int inet_rtm_newaddr(struct sk_bu */ set_ifa_lifetime(ifa, valid_lft, prefered_lft); if (ifa->ifa_flags & IFA_F_MCAUTOJOIN) { - int ret = ip_mc_config(net->ipv4.mc_autojoin_sk, - true, ifa); + int ret = ip_mc_autojoin_config(net, true, ifa); if (ret < 0) { inet_free_ifa(ifa);