From e9c5ff3d2730433ff9ffadf6eb2ab1f47708bc18 Mon Sep 17 00:00:00 2001 From: Laszlo Ersek Date: Thu, 7 Jan 2021 10:50:51 +0100 Subject: OvmfPkg/VirtioFsDxe: call IsTimeValid() before EfiTimeToEpoch() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit EmbeddedPkg/TimeBaseLib provides a verification function called IsTimeValid(), for enforcing the UEFI spec requirements on an EFI_TIME object. When EFI_FILE_PROTOCOL.SetInfo() is called in order to update the timestamps on the file, let's invoke IsTimeValid() first, before passing the new EFI_FILE_INFO.{CreateTime,LastAccessTime,ModificationTime} values to EfiTimeToEpoch(). This patch is not expected to make a practical difference, but it's better to ascertain the preconditions of EfiTimeToEpoch() on the EFI_FILE_PROTOCOL.SetInfo() caller. The FAT driver (EnhancedFatDxe) has a similar check, namely in FatSetFileInfo() -> FatIsValidTime(). Cc: Ard Biesheuvel Cc: Jordan Justen Cc: Philippe Mathieu-Daudé Signed-off-by: Laszlo Ersek Message-Id: <20210107095051.22715-1-lersek@redhat.com> Acked-by: Ard Biesheuvel --- OvmfPkg/VirtioFsDxe/Helpers.c | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/OvmfPkg/VirtioFsDxe/Helpers.c b/OvmfPkg/VirtioFsDxe/Helpers.c index 443bbdc..b81c04e 100644 --- a/OvmfPkg/VirtioFsDxe/Helpers.c +++ b/OvmfPkg/VirtioFsDxe/Helpers.c @@ -2244,12 +2244,19 @@ VirtioFsGetFuseSizeUpdate ( since the Epoch). Otherwise, Mtime is not written to. - @retval EFI_SUCCESS Output parameters have been set successfully. - - @retval EFI_ACCESS_DENIED NewInfo requests changing both CreateTime and - ModificationTime, but to values that differ from - each other. The Virtio Filesystem device does not - support this. + @retval EFI_SUCCESS Output parameters have been set successfully. + + @retval EFI_INVALID_PARAMETER At least one of the CreateTime, LastAccessTime + and ModificationTime fields in NewInfo + represents an actual update relative to the + current state of the file (expressed in Info), + but does not satisfy the UEFI spec + requirements on EFI_TIME. + + @retval EFI_ACCESS_DENIED NewInfo requests changing both CreateTime and + ModificationTime, but to values that differ + from each other. The Virtio Filesystem device + does not support this. **/ EFI_STATUS VirtioFsGetFuseTimeUpdates ( @@ -2285,6 +2292,9 @@ VirtioFsGetFuseTimeUpdates ( CompareMem (NewTime[Idx], Time[Idx], sizeof (EFI_TIME)) == 0) { Change[Idx] = FALSE; } else { + if (!IsTimeValid (NewTime[Idx])) { + return EFI_INVALID_PARAMETER; + } Change[Idx] = TRUE; Seconds[Idx] = EfiTimeToEpoch (NewTime[Idx]); } -- cgit v1.1