From 3bb46df2a3456929e2776470a5547e4827937853 Mon Sep 17 00:00:00 2001 From: oliviermartin Date: Wed, 4 Jul 2012 20:22:02 +0000 Subject: [PATCH] ArmPkg/SemihostFs: Fixed DataAbort in Semihosting File System Signed-off-by: Olivier Martin git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13501 6f19259b-4bc3-4df7-8a09-765794883524 --- ArmPkg/Filesystem/SemihostFs/Arm/SemihostFs.c | 41 +++++++++++-------- 1 file changed, 25 insertions(+), 16 deletions(-) diff --git a/ArmPkg/Filesystem/SemihostFs/Arm/SemihostFs.c b/ArmPkg/Filesystem/SemihostFs/Arm/SemihostFs.c index a9d1c37c5c..e6604ba0e2 100644 --- a/ArmPkg/Filesystem/SemihostFs/Arm/SemihostFs.c +++ b/ArmPkg/Filesystem/SemihostFs/Arm/SemihostFs.c @@ -263,18 +263,22 @@ FileDelete ( Fcb = SEMIHOST_FCB_FROM_THIS(File); - // Get the filename from the Fcb - NameSize = AsciiStrLen (Fcb->FileName); - FileName = AllocatePool (NameSize + 1); + if (!Fcb->IsRoot) { + // Get the filename from the Fcb + NameSize = AsciiStrLen (Fcb->FileName); + FileName = AllocatePool (NameSize + 1); - AsciiStrCpy (FileName, Fcb->FileName); + AsciiStrCpy (FileName, Fcb->FileName); - // Close the file if it's open. Disregard return status, - // since it might give an error if the file isn't open. - File->Close (File); - - // Call the semihost interface to delete the file. - Status = SemihostFileRemove (FileName); + // Close the file if it's open. Disregard return status, + // since it might give an error if the file isn't open. + File->Close (File); + + // Call the semihost interface to delete the file. + Status = SemihostFileRemove (FileName); + } else { + Status = EFI_UNSUPPORTED; + } return Status; } @@ -358,14 +362,19 @@ FileSetPosition ( Fcb = SEMIHOST_FCB_FROM_THIS(File); - Status = SemihostFileLength (Fcb->SemihostHandle, &Length); - if (!EFI_ERROR(Status) && (Length < Position)) { - Position = Length; - } + if (!Fcb->IsRoot) { + Status = SemihostFileLength (Fcb->SemihostHandle, &Length); + if (!EFI_ERROR(Status) && (Length < Position)) { + Position = Length; + } - Status = SemihostFileSeek (Fcb->SemihostHandle, (UINT32)Position); - if (!EFI_ERROR(Status)) { + Status = SemihostFileSeek (Fcb->SemihostHandle, (UINT32)Position); + if (!EFI_ERROR(Status)) { + Fcb->Position = Position; + } + } else { Fcb->Position = Position; + Status = EFI_SUCCESS; } return Status;