Received: by 2002:ac0:e34a:0:0:0:0:0 with SMTP id g10csp483273imn; Wed, 27 Jul 2022 11:27:48 -0700 (PDT) X-Google-Smtp-Source: AGRyM1vB5+/YAgRq+hKQnPs6yF4wQL8ORr4lbfZqTSIVw8UGuBY8z4qHyNkauqSR0JLAR+ccmvhF X-Received: by 2002:a17:907:8a0e:b0:72b:9d03:fbdb with SMTP id sc14-20020a1709078a0e00b0072b9d03fbdbmr18604667ejc.447.1658946468248; Wed, 27 Jul 2022 11:27:48 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1658946468; cv=none; d=google.com; s=arc-20160816; b=p9U7KnHSdVGqUStBdHOEAR8aMl+R93BgnAsOe8RD8deJUnzgfEuXbq8+ksmfjAnBmU 7bFV0/gOz7PwtfP9B8Jpj0v05DJWRcKkuQrNqt9ouNFFgXNYNPS3h18R96aRPKeeFBiu 9qD3iZXz6nwQZrIJuL/UtlmUt4lA+9cXqKz+mE58XfJfN7i4GGUUSDvM4kf5CEFeRG5A hKJIAlUcorFExcBInQczK1LxCedRVlllEsE7Xe38g5pLa84sI629bxR3j1MQ0DxrbrVx B5985aNfh9EWbukIjUWMCvBc0eWbVzlgKRGaX5xOE3cb6h2NCCy9XDuFNg851pJ+5t+6 4TZQ== 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=W0goD9V+BFrrE/9Mq8mcLzNKBuWWXzhwLU/PI/LYq2s=; b=Gp42IV94lwpDcQZd2CvLXXSr6hpg1LdJAjbA08UhqU8LXygMBvdVZZ/bYgUzIyGRKm aPYP6ug/g8iB4DMms/L89P/wy/WHgRrDXhGzBpqVp3GiTIC1GhFTtpB6Nr2ajnWGGdYX VLhzJdEuDbo2fxmtimTCUD9Xlbpt9fjQeTXHin/PapFnK1QTnNl8bnrr604/hP3N1v46 xiVA6H9yerIAGlRKzUNDUDIjBZVd0CwPwWUFKwzvJXa7mM95tTpJoxQ8nic7bwdUDzEF LQN6sfWcKhbbviHYtFay5NHLh2Tjbm9FT7wrPGwLJIFjcyaYNs03Rmq/o7jnIy5x45gS ThNw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b="JDhZ/m2H"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 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 out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id hv11-20020a17090760cb00b0072b6a009383si20642028ejc.826.2022.07.27.11.27.23; Wed, 27 Jul 2022 11:27:48 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b="JDhZ/m2H"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 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 S240466AbiG0QsC (ORCPT + 99 others); Wed, 27 Jul 2022 12:48:02 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43850 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S240314AbiG0QrE (ORCPT ); Wed, 27 Jul 2022 12:47:04 -0400 Received: from ams.source.kernel.org (ams.source.kernel.org [145.40.68.75]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5663952E52; Wed, 27 Jul 2022 09:32:02 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id DEBA4B821BE; Wed, 27 Jul 2022 16:32:01 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 2C3BFC433C1; Wed, 27 Jul 2022 16:32:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1658939520; bh=VmvQaZowy1d0aqIWB3OQ1GQv0t682IOsWS1iF7J5FK0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=JDhZ/m2HUQvxcM2nscczvut5ShelFugvn2uy0adWwN3m6QOu57QxPKNZqnZdhMDBP Tpr8yJkRGTQu5MyN84ErgR/gSLwW7w05KNQXXpXXCsXD8FWnsH9etHSR8mjapMWfRj PElZyTkVVQz78hwsWVfBifjjAHeKtUuC+iy0v7/k= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Hulk Robot , Yang Yingliang , Jakub Kicinski , Fedor Pchelkin Subject: [PATCH 5.10 011/105] net: make sure devices go through netdev_wait_all_refs Date: Wed, 27 Jul 2022 18:09:57 +0200 Message-Id: <20220727161012.515394196@linuxfoundation.org> X-Mailer: git-send-email 2.37.1 In-Reply-To: <20220727161012.056867467@linuxfoundation.org> References: <20220727161012.056867467@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-7.7 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_HI, SPF_HELO_NONE,SPF_PASS autolearn=ham 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 From: Fedor Pchelkin From: Jakub Kicinski commit 766b0515d5bec4b780750773ed3009b148df8c0a upstream. If register_netdevice() fails at the very last stage - the notifier call - some subsystems may have already seen it and grabbed a reference. struct net_device can't be freed right away without calling netdev_wait_all_refs(). Now that we have a clean interface in form of dev->needs_free_netdev and lenient free_netdev() we can undo what commit 93ee31f14f6f ("[NET]: Fix free_netdev on register_netdev failure.") has done and complete the unregistration path by bringing the net_set_todo() call back. After registration fails user is still expected to explicitly free the net_device, so make sure ->needs_free_netdev is cleared, otherwise rolling back the registration will cause the old double free for callers who release rtnl_lock before the free. This also solves the problem of priv_destructor not being called on notifier error. net_set_todo() will be moved back into unregister_netdevice_queue() in a follow up. Reported-by: Hulk Robot Reported-by: Yang Yingliang Signed-off-by: Jakub Kicinski Signed-off-by: Fedor Pchelkin Signed-off-by: Greg Kroah-Hartman --- net/core/dev.c | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) --- a/net/core/dev.c +++ b/net/core/dev.c @@ -10144,17 +10144,11 @@ int register_netdevice(struct net_device ret = call_netdevice_notifiers(NETDEV_REGISTER, dev); ret = notifier_to_errno(ret); if (ret) { + /* Expect explicit free_netdev() on failure */ + dev->needs_free_netdev = false; rollback_registered(dev); - rcu_barrier(); - - dev->reg_state = NETREG_UNREGISTERED; - /* We should put the kobject that hold in - * netdev_unregister_kobject(), otherwise - * the net device cannot be freed when - * driver calls free_netdev(), because the - * kobject is being hold. - */ - kobject_put(&dev->dev.kobj); + net_set_todo(dev); + goto out; } /* * Prevent userspace races by waiting until the network