From patchwork Fri Oct 12 20:39:54 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dave Jiang X-Patchwork-Id: 10639275 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 87BFF112B for ; Fri, 12 Oct 2018 20:39:57 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 772722C529 for ; Fri, 12 Oct 2018 20:39:57 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 6A3D52C531; Fri, 12 Oct 2018 20:39:57 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.1 Received: from ml01.01.org (ml01.01.org [198.145.21.10]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 18F1C2C529 for ; Fri, 12 Oct 2018 20:39:56 +0000 (UTC) Received: from [127.0.0.1] (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id D8E552116DFA7; Fri, 12 Oct 2018 13:39:56 -0700 (PDT) X-Original-To: linux-nvdimm@lists.01.org Delivered-To: linux-nvdimm@lists.01.org Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=134.134.136.100; helo=mga07.intel.com; envelope-from=dave.jiang@intel.com; receiver=linux-nvdimm@lists.01.org Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 797D32116DFA6 for ; Fri, 12 Oct 2018 13:39:55 -0700 (PDT) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga005.jf.intel.com ([10.7.209.41]) by orsmga105.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 12 Oct 2018 13:39:54 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.54,373,1534834800"; d="scan'208";a="265235456" Received: from djiang5-desk3.ch.intel.com ([143.182.136.93]) by orsmga005.jf.intel.com with ESMTP; 12 Oct 2018 13:39:54 -0700 Subject: [PATCH v2 1/4] libnvdimm: fix updating of kernel key during nvdimm key update From: Dave Jiang To: dan.j.williams@intel.com Date: Fri, 12 Oct 2018 13:39:54 -0700 Message-ID: <153937679428.70378.14173556349575982662.stgit@djiang5-desk3.ch.intel.com> In-Reply-To: <153937659078.70378.7857051533055879370.stgit@djiang5-desk3.ch.intel.com> References: <153937659078.70378.7857051533055879370.stgit@djiang5-desk3.ch.intel.com> User-Agent: StGit/unknown-version MIME-Version: 1.0 X-BeenThere: linux-nvdimm@lists.01.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "Linux-nvdimm developer list." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: linux-nvdimm@lists.01.org Errors-To: linux-nvdimm-bounces@lists.01.org Sender: "Linux-nvdimm" X-Virus-Scanned: ClamAV using ClamSMTP There are several issues WRT kernel key update when we are doing nvdimm security key update. 1. The kernel key created needs to have proper permission for update 2. We need to check key_update() return value and make sure it didn't fail 3. We need to not hold the key->sem when calling key_update() since it will call down_write() when doing modification to the key. Signed-off-by: Dave Jiang --- drivers/nvdimm/security.c | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/drivers/nvdimm/security.c b/drivers/nvdimm/security.c index 2e764abe015a..8de34b03d402 100644 --- a/drivers/nvdimm/security.c +++ b/drivers/nvdimm/security.c @@ -27,7 +27,8 @@ static struct key *make_kernel_key(struct key *key) new_key = key_alloc(&key_type_logon, key->description, GLOBAL_ROOT_UID, GLOBAL_ROOT_GID, current_cred(), - KEY_POS_SEARCH, KEY_ALLOC_NOT_IN_QUOTA, NULL); + KEY_POS_ALL & ~KEY_POS_SETATTR, + KEY_ALLOC_NOT_IN_QUOTA, NULL); if (IS_ERR(new_key)) return NULL; @@ -413,11 +414,23 @@ int nvdimm_security_change_key(struct nvdimm *nvdimm, dev_warn(dev, "key update failed: %d\n", rc); if (old_key) { - /* copy new payload to old payload */ - if (rc == 0) - key_update(make_key_ref(old_key, 1), new_data, - old_key->datalen); up_read(&old_key->sem); + /* + * With the key update done via hardware, we no longer need + * the old payload and need to replace it with the new + * payload. key_update() will acquire write sem of the + * old key and update with new data. + */ + if (rc == 0) { + rc = key_update(make_key_ref(old_key, 1), new_data, + old_key->datalen); + if (rc < 0) { + dev_warn(dev, + "kernel key update failed: %d\n", rc); + key_destroy(old_key); + nvdimm->key = NULL; + } + } } up_read(&key->sem);