Received: by 2002:a05:6902:102b:0:0:0:0 with SMTP id x11csp630710ybt; Fri, 19 Jun 2020 09:45:00 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyAJxc7ku97LJq3hwtOURAu1kfRWMivjtlBwsbE43UimR3R+TddAHOh0tnNHn8vJM6Co0A9 X-Received: by 2002:a50:ee93:: with SMTP id f19mr4074686edr.256.1592585099918; Fri, 19 Jun 2020 09:44:59 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1592585099; cv=none; d=google.com; s=arc-20160816; b=qDMyeD/Da/sXmDA8O5eI/LBQjwVQ1uXWmHbRSWMfB7J9VXicEak9w/3YRww/QINGKj ngl9BKeHrWVICUYYL4E+VSOD+20spcGBlClHXlnCni0idEGEdByVaeDs41tgXIUBTjG/ AuLvzxDU+ZCZNYlolVEEmdf2324iKqN5+RBrCj8oRnwlrs1bl3JYlWGwuEL9Tv5HXB1E uUjXNYl7blc/gK5kyXQD1PE89H677etjqLOsXnE5JdJJMPODoNCP1PtDPMJjXsw1s1fF kvYVkGW6j8qfWvma9QA6w042iuA/XJgXO+M3fs8a89UpeflnRYzuUg74m3NPBjGKHjej njQw== 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=+87E3dBkTb9jnJVyhnXuJrh3EN46UBFGAO00pemWqOM=; b=bw1NgncBA0e11JWMK9XSIqqPCBClhVso1GzI465gKr047l7w603VAk1ZlImDc+FCSq uC40jyFQwY5BLWZ51hz/wTojKH9ev0sK6DRMWGPR8i0CS/SfSP2TDi+bujHzZNXs/DwV Q8XtH2eVUwUAXdDrbOnQx09HIqe8uSvuf/wZmItpb9zB1pe7LbflPC8cIyMvENtzBUEK iE5RbtWU3fB9DjoIFDxwvkm/dv7l4jlkEQ2zTTS0b/OTaZKnZlF4JHC1D+CrCmMDxWZ8 G6p6ED4qXYP/LyDP1lSP1EUaKqXzv0AHLWBe/lOW1LTdEqiOnJHKlKpGZluKwgadMw9e diHg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=xCm3ufTK; 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 dd21si3937619edb.472.2020.06.19.09.44.36; Fri, 19 Jun 2020 09:44:59 -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=xCm3ufTK; 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 S2395489AbgFSQlz (ORCPT + 99 others); Fri, 19 Jun 2020 12:41:55 -0400 Received: from mail.kernel.org ([198.145.29.99]:36084 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2388603AbgFSOot (ORCPT ); Fri, 19 Jun 2020 10:44:49 -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 9EBFA21582; Fri, 19 Jun 2020 14:44:48 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1592577889; bh=e6c4mSOCtbZ9MZWAyitP7K/9L6JBR2Qu1rZ1L0ZHIIU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=xCm3ufTKY3M1K6m46D9C5xMCWBySHTPsmaYj6TKXq0b9+QKUFLpNnbA05Ff6qIx/N H+egSHVVkRIJZssG9+QQM+CPm4kPSrkCMwM295nBQo+b1edaL8+X0+g4q6FyoEAA+P sbiPCXeaHGQ3f/1gL3DXLx2xoeLp1c7pfiP7ZfHQ= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, NeilBrown , "J. Bruce Fields" Subject: [PATCH 4.9 123/128] sunrpc: clean up properly in gss_mech_unregister() Date: Fri, 19 Jun 2020 16:33:37 +0200 Message-Id: <20200619141626.593039183@linuxfoundation.org> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200619141620.148019466@linuxfoundation.org> References: <20200619141620.148019466@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: NeilBrown commit 24c5efe41c29ee3e55bcf5a1c9f61ca8709622e8 upstream. gss_mech_register() calls svcauth_gss_register_pseudoflavor() for each flavour, but gss_mech_unregister() does not call auth_domain_put(). This is unbalanced and makes it impossible to reload the module. Change svcauth_gss_register_pseudoflavor() to return the registered auth_domain, and save it for later release. Cc: stable@vger.kernel.org (v2.6.12+) Link: https://bugzilla.kernel.org/show_bug.cgi?id=206651 Signed-off-by: NeilBrown Signed-off-by: J. Bruce Fields Signed-off-by: Greg Kroah-Hartman --- include/linux/sunrpc/gss_api.h | 1 + include/linux/sunrpc/svcauth_gss.h | 3 ++- net/sunrpc/auth_gss/gss_mech_switch.c | 12 +++++++++--- net/sunrpc/auth_gss/svcauth_gss.c | 12 ++++++------ 4 files changed, 18 insertions(+), 10 deletions(-) --- a/include/linux/sunrpc/gss_api.h +++ b/include/linux/sunrpc/gss_api.h @@ -82,6 +82,7 @@ struct pf_desc { u32 service; char *name; char *auth_domain_name; + struct auth_domain *domain; bool datatouch; }; --- a/include/linux/sunrpc/svcauth_gss.h +++ b/include/linux/sunrpc/svcauth_gss.h @@ -20,7 +20,8 @@ int gss_svc_init(void); void gss_svc_shutdown(void); int gss_svc_init_net(struct net *net); void gss_svc_shutdown_net(struct net *net); -int svcauth_gss_register_pseudoflavor(u32 pseudoflavor, char * name); +struct auth_domain *svcauth_gss_register_pseudoflavor(u32 pseudoflavor, + char *name); u32 svcauth_gss_flavor(struct auth_domain *dom); #endif /* __KERNEL__ */ --- a/net/sunrpc/auth_gss/gss_mech_switch.c +++ b/net/sunrpc/auth_gss/gss_mech_switch.c @@ -61,6 +61,8 @@ gss_mech_free(struct gss_api_mech *gm) for (i = 0; i < gm->gm_pf_num; i++) { pf = &gm->gm_pfs[i]; + if (pf->domain) + auth_domain_put(pf->domain); kfree(pf->auth_domain_name); pf->auth_domain_name = NULL; } @@ -83,6 +85,7 @@ make_auth_domain_name(char *name) static int gss_mech_svc_setup(struct gss_api_mech *gm) { + struct auth_domain *dom; struct pf_desc *pf; int i, status; @@ -92,10 +95,13 @@ gss_mech_svc_setup(struct gss_api_mech * status = -ENOMEM; if (pf->auth_domain_name == NULL) goto out; - status = svcauth_gss_register_pseudoflavor(pf->pseudoflavor, - pf->auth_domain_name); - if (status) + dom = svcauth_gss_register_pseudoflavor( + pf->pseudoflavor, pf->auth_domain_name); + if (IS_ERR(dom)) { + status = PTR_ERR(dom); goto out; + } + pf->domain = dom; } return 0; out: --- a/net/sunrpc/auth_gss/svcauth_gss.c +++ b/net/sunrpc/auth_gss/svcauth_gss.c @@ -779,7 +779,7 @@ u32 svcauth_gss_flavor(struct auth_domai EXPORT_SYMBOL_GPL(svcauth_gss_flavor); -int +struct auth_domain * svcauth_gss_register_pseudoflavor(u32 pseudoflavor, char * name) { struct gss_domain *new; @@ -802,17 +802,17 @@ svcauth_gss_register_pseudoflavor(u32 ps name); stat = -EADDRINUSE; auth_domain_put(test); - kfree(new->h.name); - goto out_free_dom; + goto out_free_name; } - return 0; + return test; +out_free_name: + kfree(new->h.name); out_free_dom: kfree(new); out: - return stat; + return ERR_PTR(stat); } - EXPORT_SYMBOL_GPL(svcauth_gss_register_pseudoflavor); static inline int