X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=EdkModulePkg%2FUniversal%2FVariable%2FRuntimeDxe%2FVariable.c;h=f59d2a396981102b7fecde6faad535e41e028c2a;hp=178fa1ea598114d84919f95a2e268e80daa9e9e9;hb=f53a07320e7021b5a80973cc7b265bd8ce5caf40;hpb=c91eaa3d55d88598baaa979097a31cb1001ecc0d diff --git a/EdkModulePkg/Universal/Variable/RuntimeDxe/Variable.c b/EdkModulePkg/Universal/Variable/RuntimeDxe/Variable.c index 178fa1ea59..f59d2a3969 100644 --- a/EdkModulePkg/Universal/Variable/RuntimeDxe/Variable.c +++ b/EdkModulePkg/Universal/Variable/RuntimeDxe/Variable.c @@ -15,7 +15,7 @@ Module Name: Abstract: - Provide support functions for variable services. +Revision History --*/ @@ -125,8 +125,7 @@ Arguments: Returns: - EFI_INVALID_PARAMETER - Parameters not valid - EFI_SUCCESS - Variable store successfully updated + EFI STATUS --*/ { @@ -177,10 +176,11 @@ Returns: if ((DataPtr + DataSize) >= ((UINTN) ((UINT8 *) VolatileBase + VolatileBase->Size))) { return EFI_INVALID_PARAMETER; } - - // - // If Volatile Variable just do a simple mem copy. - // + } + // + // If Volatile Variable just do a simple mem copy. + // + if (Volatile) { CopyMem ((UINT8 *) ((UINTN) DataPtr), Buffer, DataSize); return EFI_SUCCESS; } @@ -212,7 +212,9 @@ Returns: &CurrWriteSize, CurrBuffer ); - return Status; + if (EFI_ERROR (Status)) { + return Status; + } } else { Size = (UINT32) (LinearOffset + PtrBlockMapEntry->BlockLength - CurrWritePtr); Status = EfiFvbWriteBlock ( @@ -808,38 +810,45 @@ Returns: if (Status == EFI_INVALID_PARAMETER) { return Status; - } - // - // The size of the VariableName, including the Unicode Null in bytes plus - // the DataSize is limited to maximum size of MAX_VARIABLE_SIZE (1024) bytes. - // - else if (sizeof (VARIABLE_HEADER) + ArrayLength (VariableName) + DataSize > MAX_VARIABLE_SIZE) { + } else if (!EFI_ERROR (Status) && Variable.Volatile && EfiAtRuntime()) { + // + // If EfiAtRuntime and the variable is Volatile and Runtime Access, + // the volatile is ReadOnly, and SetVariable should be aborted and + // return EFI_WRITE_PROTECTED. + // + return EFI_WRITE_PROTECTED; + } else if (sizeof (VARIABLE_HEADER) + ArrayLength (VariableName) + DataSize > MAX_VARIABLE_SIZE) { + // + // The size of the VariableName, including the Unicode Null in bytes plus + // the DataSize is limited to maximum size of MAX_VARIABLE_SIZE (1024) bytes. + // return EFI_INVALID_PARAMETER; - } - // - // Make sure if runtime bit is set, boot service bit is set also - // - else if ((Attributes & (EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS)) == EFI_VARIABLE_RUNTIME_ACCESS - ) { + } else if (Attributes == EFI_VARIABLE_NON_VOLATILE) { + // + // Make sure not only EFI_VARIABLE_NON_VOLATILE is set + // return EFI_INVALID_PARAMETER; - } - // - // Runtime but Attribute is not Runtime - // - else if (EfiAtRuntime () && Attributes && !(Attributes & EFI_VARIABLE_RUNTIME_ACCESS)) { + } else if ((Attributes & (EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS)) == + EFI_VARIABLE_RUNTIME_ACCESS) { + // + // Make sure if runtime bit is set, boot service bit is set also + // return EFI_INVALID_PARAMETER; - } - // - // Cannot set volatile variable in Runtime - // - else if (EfiAtRuntime () && Attributes && !(Attributes & EFI_VARIABLE_NON_VOLATILE)) { + } else if (EfiAtRuntime () && Attributes && !(Attributes & EFI_VARIABLE_RUNTIME_ACCESS)) { + // + // Runtime but Attribute is not Runtime + // return EFI_INVALID_PARAMETER; - } - // - // Setting a data variable with no access, or zero DataSize attributes - // specified causes it to be deleted. - // - else if (DataSize == 0 || Attributes == 0) { + } else if (EfiAtRuntime () && Attributes && !(Attributes & EFI_VARIABLE_NON_VOLATILE)) { + // + // Cannot set volatile variable in Runtime + // + return EFI_INVALID_PARAMETER; + } else if (DataSize == 0 || (Attributes & (EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS)) == 0) { + // + // Setting a data variable with no access, or zero DataSize attributes + // specified causes it to be deleted. + // if (!EFI_ERROR (Status)) { State = Variable.CurrPtr->State; State &= VAR_DELETED;