Received: by 2002:a05:6902:102b:0:0:0:0 with SMTP id x11csp580071ybt; Fri, 19 Jun 2020 08:36:45 -0700 (PDT) X-Google-Smtp-Source: ABdhPJy7rZ1lhJbdyEGJTNuocUWi9i7mZYHEIeGVP0CiJPDu/LyB7s/Rtqfbhykzmyac+KJordOZ X-Received: by 2002:a17:906:fcc2:: with SMTP id qx2mr3368420ejb.420.1592581005017; Fri, 19 Jun 2020 08:36:45 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1592581005; cv=none; d=google.com; s=arc-20160816; b=oNX1/j3IRJ2cfmu7dDYbul6lnwVR3wqEE6MPUC4uidvS/An4EeLhLoXQu+NrbjYFRn 3M+ndliroMTViZcGvOw6cg7YVy9T4p3J/PCiZRUXs2gtwL9koH5McZbrSdGiH+yJ9Kon goloa+aBgBcwL69oJ9smT7vsmQOWxb6PMptpZ4i2RcXr28zxJ1nbjwg4PMZaYzHzDvlh YpJxepsT+pEwMEJVTd2srXFZlpKo6twTMzGQ0UaZYG7QN/F/ZpwbOOpJGfpwBRt1c8bS ga6QJ3Y9nO3CRccnh2q55PrcUAZLMWFIrPLhTKZoxV/ESz5VtH+begJquuKkf6WRSqB3 dfpw== 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=uaJ84qKS/JMcWX2stJsqHZRtBLCDv2ktSo1XoCLUffE=; b=QvgVkIQiNGO6TC98sNB7eOAhqSumPtLMdHNFQtxquJE9SpJ3BvBDBzv7JoseVwK8un xGYgBvziiqMHZy9JGO9yYMTBzAetz2YzbbqU/5Cm23T9Atabnclr4OLUhmELFWHMz+fP R+sK9/0JUajmJ3Ae4rTdLF3xjQ9sawzCufBszlad19t2lqlBqLE8xtKtkj/KmPiSU90z mF012WK6S2JjLfiwvXn/iidB6+u4/TyUzordSBoiF5YVHQivFFMvJF8R80md3bFklrYx he0dg8M9vTJhc6pCmtyf8A87QeROJrBZhObxgrvH/+eil/YJ8xF1D+p6qZIBlFGM1PTI tIAg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=o0qpPwBE; 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 ba16si4034254edb.52.2020.06.19.08.36.22; Fri, 19 Jun 2020 08:36:45 -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=o0qpPwBE; 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 S2393954AbgFSPdd (ORCPT + 99 others); Fri, 19 Jun 2020 11:33:33 -0400 Received: from mail.kernel.org ([198.145.29.99]:36914 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2393935AbgFSPcy (ORCPT ); Fri, 19 Jun 2020 11:32:54 -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 7195A20786; Fri, 19 Jun 2020 15:32:53 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1592580774; bh=Fn4AYlScuXenMTHycSwMZpCUV9EpZ+LnQQ2sQstNaZI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=o0qpPwBEjus5Z3ZSRTj1YgVxoqp+4z3lakkTwx9z6O9hUawXhMFrOa9uDOPCISIaJ K42om7qyIC+XoYz/giHOiRFXvkTlE0wWNyyIECWSWi5aAdfBohTudTlJD/Q2Pr0ACI cE8qdAa7ZZtFC/XPy3hordPFaeOrUuoxrEK/vEqE= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, NeilBrown , "J. Bruce Fields" Subject: [PATCH 5.7 347/376] sunrpc: clean up properly in gss_mech_unregister() Date: Fri, 19 Jun 2020 16:34:25 +0200 Message-Id: <20200619141726.753322804@linuxfoundation.org> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200619141710.350494719@linuxfoundation.org> References: <20200619141710.350494719@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 @@ -84,6 +84,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 /* _LINUX_SUNRPC_SVCAUTH_GSS_H */ --- a/net/sunrpc/auth_gss/gss_mech_switch.c +++ b/net/sunrpc/auth_gss/gss_mech_switch.c @@ -37,6 +37,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; } @@ -59,6 +61,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; @@ -68,10 +71,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 @@ -809,7 +809,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; @@ -832,17 +832,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