On 08/21/15 20:28, Michael Zimmermann wrote:
> I'm using this lib on ARM and it generates unaligned access in it's current
> state due to the heavy use of pointer casts.
> This changes the binary format so all previously saved data will be lost.
> 
> diff --git a/OvmfPkg/Library/SerializeVariablesLib/SerializeVariablesLib.c
> b/OvmfPkg/Library/SerializeVariablesLib/SerializeVariablesLib.c
> index 6822c5c..f6c92c1 100644

(1) malformed patch

(2) subject line doesn't spell out package & component name (should
start with OvmfPkg: SerializeVariablesLib: ...)

(3) what are you using this for on ARM? This library had been meant as a
temporary stop-gap for OVMF until OVMF got flash (and therefore real
non-volatile variable support). In general the way forward here should
be removing this infrastructure from OvmfPkg, not adopting it elsewhere.

Thanks
Laszlo

> --- a/OvmfPkg/Library/SerializeVariablesLib/SerializeVariablesLib.c
> +++ b/OvmfPkg/Library/SerializeVariablesLib/SerializeVariablesLib.c
> @@ -80,13 +80,13 @@ UnpackVariableFromBuffer (
>    }
> 
>    *Name = (CHAR16*) (BytePtr + Offset);
> -  Offset = Offset + *(UINT32*)BytePtr;
> +  Offset = Offset + ALIGN_VALUE(*NameSize, sizeof(UINT32));
>    if (Offset > MaxSize) {
>      return EFI_INVALID_PARAMETER;
>    }
> 
>    *Guid = (EFI_GUID*) (BytePtr + Offset);
> -  Offset = Offset + sizeof (EFI_GUID);
> +  Offset = Offset + ALIGN_VALUE(sizeof (EFI_GUID), sizeof(UINT32));
>    if (Offset > MaxSize) {
>      return EFI_INVALID_PARAMETER;
>    }
> @@ -104,7 +104,7 @@ UnpackVariableFromBuffer (
>    }
> 
>    *Data = (VOID*) (BytePtr + Offset);
> -  Offset = Offset + *DataSize;
> +  Offset = Offset + ALIGN_VALUE(*DataSize, sizeof(UINT32));
>    if (Offset > MaxSize) {
>      return EFI_INVALID_PARAMETER;
>    }
> @@ -284,26 +284,26 @@ IterateVariablesCallbackSetSystemVariable (
>    IN  VOID                         *Data
>    )
>  {
> -  EFI_STATUS          Status;
> -  STATIC CONST UINT32 AuthMask =
> -                        EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS |
> -                        EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS;
> -
> -  Status = gRT->SetVariable (
> -             VariableName,
> -             VendorGuid,
> -             Attributes,
> -             DataSize,
> -             Data
> -             );
> -
> -  if (Status == EFI_SECURITY_VIOLATION && (Attributes & AuthMask) != 0) {
> -    DEBUG ((DEBUG_WARN, "%a: setting authenticated variable \"%s\" "
> -            "failed with EFI_SECURITY_VIOLATION, ignoring\n", __FUNCTION__,
> -            VariableName));
> -    Status = EFI_SUCCESS;
> -  }
> -  return Status;
> +  EFI_STATUS          Status;
> +  STATIC CONST UINT32 AuthMask =
> +                        EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS |
> +                        EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS;
> +
> +  Status = gRT->SetVariable (
> +             VariableName,
> +             VendorGuid,
> +             Attributes,
> +             DataSize,
> +             Data
> +             );
> +
> +  if (Status == EFI_SECURITY_VIOLATION && (Attributes & AuthMask) != 0) {
> +    DEBUG ((DEBUG_WARN, "%a: setting authenticated variable \"%s\" "
> +            "failed with EFI_SECURITY_VIOLATION, ignoring\n", __FUNCTION__,
> +            VariableName));
> +    Status = EFI_SUCCESS;
> +  }
> +  return Status;
>  }
> 
> 
> @@ -366,7 +366,7 @@ AppendToBuffer (
>      Size
>      );
> 
> -  Instance->DataSize = NewSize;
> +  Instance->DataSize = ALIGN_VALUE(NewSize, sizeof(UINT32));
>  }
> 
> 
> @@ -764,12 +764,12 @@ SerializeVariablesAddVariable (
>    SerializedNameSize = (UINT32) StrSize (VariableName);
> 
>    SerializedSize =
> -    sizeof (SerializedNameSize) +
> -    SerializedNameSize +
> -    sizeof (*VendorGuid) +
> -    sizeof (Attributes) +
> -    sizeof (SerializedDataSize) +
> -    DataSize;
> +    ALIGN_VALUE(sizeof (SerializedNameSize), sizeof(UINT32)) +
> +    ALIGN_VALUE(SerializedNameSize, sizeof(UINT32)) +
> +    ALIGN_VALUE(sizeof (*VendorGuid), sizeof(UINT32)) +
> +    ALIGN_VALUE(sizeof (Attributes), sizeof(UINT32)) +
> +    ALIGN_VALUE(sizeof (SerializedDataSize), sizeof(UINT32)) +
> +    ALIGN_VALUE(DataSize, sizeof(UINT32));
> 
>    Status = EnsureExtraBufferSpace (
>               Instance,
> _______________________________________________
> edk2-devel mailing list
> [email protected]
> https://lists.01.org/mailman/listinfo/edk2-devel
> 

_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to