Hi Ard,

Are you saying that ConvertEfiFileProtocolToShellHandle() modifies the device 
path passed in?

Is that a bug in this API?

Mike


> -----Original Message-----
> From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Ard Biesheuvel
> Sent: Wednesday, December 7, 2022 8:13 AM
> To: devel@edk2.groups.io
> Cc: Ni, Ray <ray...@intel.com>; Gao, Zhichao <zhichao....@intel.com>; Ard 
> Biesheuvel <a...@kernel.org>
> Subject: [edk2-devel] [PATCH] ShellPkg: Avoid corrupting installed device 
> path protocols
> 
> The Shell locates device path protocol instances from the database and
> happily passes them to destructive device path operations, resulting in
> the original protocol to get corrupted as well. So take a copy instead,
> and discard it once we no longer need it.
> 
> Signed-off-by: Ard Biesheuvel <a...@kernel.org>
> ---
>  ShellPkg/Application/Shell/ShellProtocol.c    | 10 +++-
>  .../Library/UefiShellLevel2CommandsLib/Map.c  | 47 +++++++++++--------
>  2 files changed, 36 insertions(+), 21 deletions(-)
> 
> diff --git a/ShellPkg/Application/Shell/ShellProtocol.c 
> b/ShellPkg/Application/Shell/ShellProtocol.c
> index 509eb60e40f4..6dbf344520d0 100644
> --- a/ShellPkg/Application/Shell/ShellProtocol.c
> +++ b/ShellPkg/Application/Shell/ShellProtocol.c
> @@ -838,7 +838,9 @@ EfiShellOpenRootByHandle (
>    EFI_STATUS                       Status;
> 
>    EFI_SIMPLE_FILE_SYSTEM_PROTOCOL  *SimpleFileSystem;
> 
>    EFI_FILE_PROTOCOL                *RealFileHandle;
> 
> -  EFI_DEVICE_PATH_PROTOCOL         *DevPath;
> 
> +  CONST EFI_DEVICE_PATH_PROTOCOL   *DevPath;
> 
> +  VOID                             *DevPathBuf;
> 
> +  EFI_DEVICE_PATH_PROTOCOL         *DevPathCopy;
> 
> 
> 
>    //
> 
>    // get the simple file system interface
> 
> @@ -875,7 +877,11 @@ EfiShellOpenRootByHandle (
>      return Status;
> 
>    }
> 
> 
> 
> -  *FileHandle = ConvertEfiFileProtocolToShellHandle (RealFileHandle, 
> EfiShellGetMapFromDevicePath (&DevPath));
> 
> +  DevPathCopy = DevPathBuf = DuplicateDevicePath (DevPath);
> 
> +  *FileHandle = ConvertEfiFileProtocolToShellHandle (RealFileHandle,
> 
> +                                                     
> EfiShellGetMapFromDevicePath (&DevPathCopy)
> 
> +                                                     );
> 
> +  SHELL_FREE_NON_NULL (DevPathBuf);
> 
>    return (EFI_SUCCESS);
> 
>  }
> 
> 
> 
> diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/Map.c 
> b/ShellPkg/Library/UefiShellLevel2CommandsLib/Map.c
> index f3c888edd48c..094e08eab4a5 100644
> --- a/ShellPkg/Library/UefiShellLevel2CommandsLib/Map.c
> +++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/Map.c
> @@ -134,7 +134,7 @@ SearchList (
>  **/
> 
>  CHAR16 *
> 
>  GetDeviceMediaType (
> 
> -  IN  EFI_DEVICE_PATH_PROTOCOL  *DevicePath
> 
> +  IN  CONST EFI_DEVICE_PATH_PROTOCOL  *DevicePath
> 
>    )
> 
>  {
> 
>    ACPI_HID_DEVICE_PATH  *Acpi;
> 
> @@ -179,7 +179,7 @@ GetDeviceMediaType (
>  **/
> 
>  BOOLEAN
> 
>  IsRemoveableDevice (
> 
> -  IN EFI_DEVICE_PATH_PROTOCOL  *DevicePath
> 
> +  IN CONST EFI_DEVICE_PATH_PROTOCOL  *DevicePath
> 
>    )
> 
>  {
> 
>    if (NULL == DevicePath) {
> 
> @@ -307,24 +307,29 @@ PerformSingleMappingDisplay (
>    IN CONST EFI_HANDLE  Handle
> 
>    )
> 
>  {
> 
> -  EFI_DEVICE_PATH_PROTOCOL  *DevPath;
> 
> -  EFI_DEVICE_PATH_PROTOCOL  *DevPathCopy;
> 
> -  CONST CHAR16              *MapList;
> 
> -  CHAR16                    *CurrentName;
> 
> -  CHAR16                    *MediaType;
> 
> -  CHAR16                    *DevPathString;
> 
> -  CHAR16                    *TempSpot;
> 
> -  CHAR16                    *Alias;
> 
> -  UINTN                     TempLen;
> 
> -  BOOLEAN                   Removable;
> 
> -  CONST CHAR16              *TempSpot2;
> 
> +  CONST EFI_DEVICE_PATH_PROTOCOL  *DevPath;
> 
> +  VOID                            *DevPathBuf;
> 
> +  EFI_DEVICE_PATH_PROTOCOL        *DevPathCopy;
> 
> +  CONST CHAR16                    *MapList;
> 
> +  CHAR16                          *CurrentName;
> 
> +  CHAR16                          *MediaType;
> 
> +  CHAR16                          *DevPathString;
> 
> +  CHAR16                          *TempSpot;
> 
> +  CHAR16                          *Alias;
> 
> +  UINTN                           TempLen;
> 
> +  BOOLEAN                         Removable;
> 
> +  CONST CHAR16                    *TempSpot2;
> 
> 
> 
>    Alias       = NULL;
> 
>    TempSpot2   = NULL;
> 
>    CurrentName = NULL;
> 
>    DevPath     = DevicePathFromHandle (Handle);
> 
> -  DevPathCopy = DevPath;
> 
> +  DevPathBuf  = DuplicateDevicePath (DevPath);
> 
> +  DevPathCopy = DevPathBuf;
> 
>    MapList     = gEfiShellProtocol->GetMapFromDevicePath (&DevPathCopy);
> 
> +
> 
> +  SHELL_FREE_NON_NULL (DevPathBuf);
> 
> +
> 
>    if (MapList == NULL) {
> 
>      return EFI_NOT_FOUND;
> 
>    }
> 
> @@ -485,16 +490,20 @@ PerformSingleMappingDelete (
>    IN CONST EFI_HANDLE  Handle
> 
>    )
> 
>  {
> 
> -  EFI_DEVICE_PATH_PROTOCOL  *DevPath;
> 
> -  EFI_DEVICE_PATH_PROTOCOL  *DevPathCopy;
> 
> -  CONST CHAR16              *MapList;
> 
> -  CHAR16                    *CurrentName;
> 
> +  CONST EFI_DEVICE_PATH_PROTOCOL  *DevPath;
> 
> +  VOID                            *DevPathBuf;
> 
> +  EFI_DEVICE_PATH_PROTOCOL        *DevPathCopy;
> 
> +  CONST CHAR16                    *MapList;
> 
> +  CHAR16                          *CurrentName;
> 
> 
> 
>    DevPath     = DevicePathFromHandle (Handle);
> 
> -  DevPathCopy = DevPath;
> 
> +  DevPathBuf  = DuplicateDevicePath (DevPath);
> 
> +  DevPathCopy = DevPathBuf;
> 
>    MapList     = gEfiShellProtocol->GetMapFromDevicePath (&DevPathCopy);
> 
>    CurrentName = NULL;
> 
> 
> 
> +  SHELL_FREE_NON_NULL (DevPathBuf);
> 
> +
> 
>    if (MapList == NULL) {
> 
>      return (EFI_NOT_FOUND);
> 
>    }
> 
> --
> 2.35.1
> 
> 
> 
> -=-=-=-=-=-=
> Groups.io Links: You receive all messages sent to this group.
> View/Reply Online (#97090): https://edk2.groups.io/g/devel/message/97090
> Mute This Topic: https://groups.io/mt/95518373/1643496
> Group Owner: devel+ow...@edk2.groups.io
> Unsubscribe: https://edk2.groups.io/g/devel/unsub [michael.d.kin...@intel.com]
> -=-=-=-=-=-=
> 



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#97141): https://edk2.groups.io/g/devel/message/97141
Mute This Topic: https://groups.io/mt/95518373/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-


Reply via email to