From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by mx.groups.io with SMTP id smtpd.web12.3222.1594350298526161609 for ; Thu, 09 Jul 2020 20:04:59 -0700 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: intel.com, ip: 134.134.136.20, mailfrom: michael.d.kinney@intel.com) IronPort-SDR: 7BikDhoDMa4zYkJJKCXmxY1AUFCsQw52aY/evWcnfCT3spZ93M/6BpsgYzxDs2DUU3eTqdGzn0 1YLW1TU2aMqw== X-IronPort-AV: E=McAfee;i="6000,8403,9677"; a="136348273" X-IronPort-AV: E=Sophos;i="5.75,334,1589266800"; d="scan'208";a="136348273" X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 09 Jul 2020 20:04:57 -0700 IronPort-SDR: jJ6FzMrcbC+SkxvdMJJJq1dD8aLxAUC10P4p0Qdd7T3SFCg4/ydqfa8YyRjeJz89OBefvGHn+V aze7zW4CIbKw== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.75,334,1589266800"; d="scan'208";a="484030332" Received: from mdkinney-mobl2.amr.corp.intel.com ([10.254.110.254]) by fmsmga006.fm.intel.com with ESMTP; 09 Jul 2020 20:04:57 -0700 From: "Michael D Kinney" To: devel@edk2.groups.io Cc: Hao A Wu , Liming Gao Subject: [Patch] MdeModulePkg/Variable/RuntimeDxe: Fix return status from Reclaim() Date: Thu, 9 Jul 2020 20:04:55 -0700 Message-Id: <20200710030455.6036-1-michael.d.kinney@intel.com> X-Mailer: git-send-email 2.21.0.windows.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit REF: https://bugzilla.tianocore.org/show_bug.cgi?id=2844 Update Reclaim() to return the error status from the reclaim operation and not the status of SynchronizeRuntimeVariableCache() that can be EFI_SUCCESS even through the status from reclaim is an error. Without this change, the return status from SetVariable() can be EFI_SUCCESS even though the variable was not actually set. This occurs if the variable store is full and a Reclaim() is invoked to free up space and even after all possible space is freed, there is still not enough room for the variable being set. This condition should return EFI_OUT_OF_RESOURCES. Cc: Hao A Wu Cc: Liming Gao Signed-off-by: Michael D Kinney --- .../Universal/Variable/RuntimeDxe/Variable.c | 30 +++++++++++-------- 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/MdeModulePkg/Universal/Variable/RuntimeDxe/Variable.c b/MdeModulePkg/Universal/Variable/RuntimeDxe/Variable.c index 1e71fc642c..41f8ff4ceb 100644 --- a/MdeModulePkg/Universal/Variable/RuntimeDxe/Variable.c +++ b/MdeModulePkg/Universal/Variable/RuntimeDxe/Variable.c @@ -531,6 +531,7 @@ Reclaim ( VOID *Point1; BOOLEAN FoundAdded; EFI_STATUS Status; + EFI_STATUS DoneStatus; UINTN CommonVariableTotalSize; UINTN CommonUserVariableTotalSize; UINTN HwErrVariableTotalSize; @@ -774,25 +775,30 @@ Reclaim ( } Done: + DoneStatus = EFI_SUCCESS; if (IsVolatile || mVariableModuleGlobal->VariableGlobal.EmuNvMode) { - Status = SynchronizeRuntimeVariableCache ( - &mVariableModuleGlobal->VariableGlobal.VariableRuntimeCacheContext.VariableRuntimeVolatileCache, - 0, - VariableStoreHeader->Size - ); - ASSERT_EFI_ERROR (Status); + DoneStatus = SynchronizeRuntimeVariableCache ( + &mVariableModuleGlobal->VariableGlobal.VariableRuntimeCacheContext.VariableRuntimeVolatileCache, + 0, + VariableStoreHeader->Size + ); + ASSERT_EFI_ERROR (DoneStatus); FreePool (ValidBuffer); } else { // // For NV variable reclaim, we use mNvVariableCache as the buffer, so copy the data back. // CopyMem (mNvVariableCache, (UINT8 *) (UINTN) VariableBase, VariableStoreHeader->Size); - Status = SynchronizeRuntimeVariableCache ( - &mVariableModuleGlobal->VariableGlobal.VariableRuntimeCacheContext.VariableRuntimeNvCache, - 0, - VariableStoreHeader->Size - ); - ASSERT_EFI_ERROR (Status); + DoneStatus = SynchronizeRuntimeVariableCache ( + &mVariableModuleGlobal->VariableGlobal.VariableRuntimeCacheContext.VariableRuntimeNvCache, + 0, + VariableStoreHeader->Size + ); + ASSERT_EFI_ERROR (DoneStatus); + } + + if (!EFI_ERROR (Status) && EFI_ERROR (DoneStatus)) { + Status = DoneStatus; } return Status; -- 2.21.0.windows.1