]> git.proxmox.com Git - mirror_edk2.git/blobdiff - UnixPkg/UnixSimpleFileSystemDxe/UnixSimpleFileSystem.c
When SerialPortWrite() is called with a non-NULL Buffer and NumberOfBytes is passed...
[mirror_edk2.git] / UnixPkg / UnixSimpleFileSystemDxe / UnixSimpleFileSystem.c
index 9d9325c105ecb7666da8a6f88d0c0cbe0cf88628..0bd1c65c2a0b1f0e948aeb109df855e6c23484f4 100644 (file)
@@ -1,7 +1,7 @@
 /*++\r
 \r
-Copyright (c) 2006 - 2007, Intel Corporation                                                         \r
-All rights reserved. This program and the accompanying materials                          \r
+Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials                          \r
 are licensed and made available under the terms and conditions of the BSD License         \r
 which accompanies this distribution.  The full text of the license may be found at        \r
 http://opensource.org/licenses/bsd-license.php                                            \r
@@ -350,9 +350,9 @@ Done:
     if (Private != NULL) {\r
 \r
       if (Private->VolumeLabel != NULL)\r
-       gBS->FreePool (Private->VolumeLabel);\r
+  gBS->FreePool (Private->VolumeLabel);\r
       if (Private->FilePath != NULL)\r
-       gBS->FreePool (Private->FilePath);\r
+  gBS->FreePool (Private->FilePath);\r
       FreeUnicodeStringTable (Private->ControllerNameTable);\r
 \r
       gBS->FreePool (Private);\r
@@ -457,7 +457,7 @@ EFI_STATUS
 EFIAPI\r
 UnixSimpleFileSystemOpenVolume (\r
   IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL  *This,\r
-  OUT EFI_FILE                        **Root\r
+  OUT EFI_FILE_PROTOCOL               **Root\r
   )\r
 /*++\r
 \r
@@ -566,6 +566,8 @@ Done:
 \r
       gBS->FreePool (PrivateFile);\r
     }\r
+    \r
+    *Root = NULL;\r
   }\r
 \r
   gBS->RestoreTPL (OldTpl);\r
@@ -576,11 +578,11 @@ Done:
 EFI_STATUS\r
 EFIAPI\r
 UnixSimpleFileSystemOpen (\r
-  IN  EFI_FILE  *This,\r
-  OUT EFI_FILE  **NewHandle,\r
-  IN  CHAR16    *FileName,\r
-  IN  UINT64    OpenMode,\r
-  IN  UINT64    Attributes\r
+  IN  EFI_FILE_PROTOCOL   *This,\r
+  OUT EFI_FILE_PROTOCOL   **NewHandle,\r
+  IN  CHAR16              *FileName,\r
+  IN  UINT64              OpenMode,\r
+  IN  UINT64              Attributes\r
   )\r
 /*++\r
 \r
@@ -628,7 +630,7 @@ Returns:
 // TODO:    EFI_INVALID_PARAMETER - add return value to function comment\r
 // TODO:    EFI_INVALID_PARAMETER - add return value to function comment\r
 {\r
-  EFI_FILE                          *Root;\r
+  EFI_FILE_PROTOCOL                 *Root;\r
   UNIX_EFI_FILE_PRIVATE           *PrivateFile;\r
   UNIX_EFI_FILE_PRIVATE           *NewPrivateFile;\r
   UNIX_SIMPLE_FILE_SYSTEM_PRIVATE *PrivateRoot;\r
@@ -834,7 +836,7 @@ OpenRoot:
       NewPrivateFile->IsDirectoryPath = FALSE;\r
     }\r
   } else {\r
-    struct stat finfo;\r
+    STAT_FIX finfo;\r
     int res = NewPrivateFile->UnixThunk->Stat (NewPrivateFile->FileName, &finfo);\r
     if (res == 0 && S_ISDIR(finfo.st_mode))\r
       NewPrivateFile->IsDirectoryPath = TRUE;\r
@@ -860,7 +862,7 @@ OpenRoot:
       // Create a directory\r
       //\r
       if (NewPrivateFile->UnixThunk->MkDir (NewPrivateFile->FileName, 0777) != 0) {\r
-       INTN LastError;\r
+  INTN LastError;\r
 \r
         LastError = PrivateFile->UnixThunk->GetErrno ();\r
         if (LastError != EEXIST) {\r
@@ -895,9 +897,9 @@ OpenRoot:
        0666);\r
     if (NewPrivateFile->fd < 0) {\r
       if (PrivateFile->UnixThunk->GetErrno () == ENOENT) {\r
-       Status = EFI_NOT_FOUND;\r
+  Status = EFI_NOT_FOUND;\r
       } else {\r
-       Status = EFI_ACCESS_DENIED;\r
+  Status = EFI_ACCESS_DENIED;\r
       }\r
     }\r
   }\r
@@ -961,7 +963,7 @@ Done: ;
 EFI_STATUS\r
 EFIAPI\r
 UnixSimpleFileSystemClose (\r
-  IN EFI_FILE  *This\r
+  IN EFI_FILE_PROTOCOL  *This\r
   )\r
 /*++\r
 \r
@@ -1015,7 +1017,7 @@ Returns:
 EFI_STATUS\r
 EFIAPI\r
 UnixSimpleFileSystemDelete (\r
-  IN EFI_FILE  *This\r
+  IN EFI_FILE_PROTOCOL  *This\r
   )\r
 /*++\r
 \r
@@ -1105,7 +1107,7 @@ Returns:
   struct tm *tm;\r
   tm = UnixThunk->GmTime (&SystemTime);\r
   Time->Year   = tm->tm_year;\r
-  Time->Month  = tm->tm_mon;\r
+  Time->Month  = tm->tm_mon + 1;\r
   Time->Day    = tm->tm_mday;\r
   Time->Hour   = tm->tm_hour;\r
   Time->Minute = tm->tm_min;\r
@@ -1149,10 +1151,10 @@ Returns:
   UINTN                       NameSize;\r
   UINTN                       ResultSize;\r
   EFI_FILE_INFO               *Info;\r
-  CHAR8                      *RealFileName;\r
-  CHAR8                      *TempPointer;\r
+  CHAR8                       *RealFileName;\r
+  CHAR8                       *TempPointer;\r
   CHAR16                      *BufferFileName;\r
-  struct stat                 buf;\r
+  STAT_FIX                    buf;\r
 \r
   if (FileName != NULL) {\r
     RealFileName = FileName;\r
@@ -1182,7 +1184,7 @@ Returns:
   }\r
   if (PrivateFile->UnixThunk->Stat (\r
           FileName == NULL ? PrivateFile->FileName : FileName,\r
-         &buf) < 0)\r
+    &buf) < 0)\r
     return EFI_DEVICE_ERROR;\r
 \r
   Status  = EFI_SUCCESS;\r
@@ -1219,9 +1221,9 @@ Returns:
 EFI_STATUS\r
 EFIAPI\r
 UnixSimpleFileSystemRead (\r
-  IN     EFI_FILE  *This,\r
-  IN OUT UINTN     *BufferSize,\r
-  OUT    VOID      *Buffer\r
+  IN     EFI_FILE_PROTOCOL  *This,\r
+  IN OUT UINTN              *BufferSize,\r
+  OUT    VOID               *Buffer\r
   )\r
 /*++\r
 \r
@@ -1262,7 +1264,12 @@ Returns:
   CHAR8                   *FullFileName;\r
   EFI_TPL                 OldTpl;\r
 \r
-  if (This == NULL || BufferSize == NULL || Buffer == NULL) {\r
+  if (This == NULL || BufferSize == NULL) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+  \r
+  if ((*BufferSize != 0) && (Buffer == NULL)) {\r
+    // Buffer can be NULL  if *BufferSize is zero\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
@@ -1278,9 +1285,9 @@ Returns:
     }\r
 \r
     Res = PrivateFile->UnixThunk->Read (\r
-                                        PrivateFile->fd,\r
-                                        Buffer,\r
-                                        *BufferSize);\r
+           PrivateFile->fd,\r
+           Buffer,\r
+           *BufferSize);\r
     if (Res < 0) {\r
       Status = EFI_DEVICE_ERROR;\r
       goto Done;\r
@@ -1329,14 +1336,14 @@ Returns:
   if (EFI_ERROR (Status)) {\r
     goto Done;\r
   }\r
-                 \r
+      \r
   AsciiStrCpy(FullFileName, PrivateFile->FileName);\r
   AsciiStrCat(FullFileName, "/");\r
   AsciiStrCat(FullFileName, PrivateFile->Dirent->d_name);\r
   Status = UnixSimpleFileSystemFileInfo (PrivateFile,\r
-                                         FullFileName,\r
-                                         BufferSize,\r
-                                         Buffer);\r
+            FullFileName,\r
+            BufferSize,\r
+            Buffer);\r
   gBS->FreePool (FullFileName);\r
 \r
   PrivateFile->Dirent = NULL;\r
@@ -1350,9 +1357,9 @@ Done:
 EFI_STATUS\r
 EFIAPI\r
 UnixSimpleFileSystemWrite (\r
-  IN     EFI_FILE  *This,\r
-  IN OUT UINTN     *BufferSize,\r
-  IN     VOID      *Buffer\r
+  IN     EFI_FILE_PROTOCOL  *This,\r
+  IN OUT UINTN              *BufferSize,\r
+  IN     VOID               *Buffer\r
   )\r
 /*++\r
 \r
@@ -1416,9 +1423,9 @@ Returns:
   }\r
 \r
   Res = PrivateFile->UnixThunk->Write (\r
-                                       PrivateFile->fd,\r
-                                       Buffer,\r
-                                       *BufferSize);\r
+          PrivateFile->fd,\r
+          Buffer,\r
+          *BufferSize);\r
   if (Res == (UINTN)-1) {\r
     Status = EFI_DEVICE_ERROR;\r
     goto Done;\r
@@ -1438,8 +1445,8 @@ Done:
 EFI_STATUS\r
 EFIAPI\r
 UnixSimpleFileSystemSetPosition (\r
-  IN EFI_FILE  *This,\r
-  IN UINT64    Position\r
+  IN EFI_FILE_PROTOCOL  *This,\r
+  IN UINT64             Position\r
   )\r
 /*++\r
 \r
@@ -1505,8 +1512,8 @@ Done:
 EFI_STATUS\r
 EFIAPI\r
 UnixSimpleFileSystemGetPosition (\r
-  IN  EFI_FILE  *This,\r
-  OUT UINT64    *Position\r
+  IN  EFI_FILE_PROTOCOL   *This,\r
+  OUT UINT64              *Position\r
   )\r
 /*++\r
 \r
@@ -1555,10 +1562,10 @@ Returns:
 EFI_STATUS\r
 EFIAPI\r
 UnixSimpleFileSystemGetInfo (\r
-  IN     EFI_FILE  *This,\r
-  IN     EFI_GUID  *InformationType,\r
-  IN OUT UINTN     *BufferSize,\r
-  OUT    VOID      *Buffer\r
+  IN     EFI_FILE_PROTOCOL  *This,\r
+  IN     EFI_GUID           *InformationType,\r
+  IN OUT UINTN              *BufferSize,\r
+  OUT    VOID               *Buffer\r
   )\r
 /*++\r
 \r
@@ -1664,7 +1671,7 @@ Done:
 EFI_STATUS\r
 EFIAPI\r
 UnixSimpleFileSystemSetInfo (\r
-  IN EFI_FILE         *This,\r
+  IN EFI_FILE_PROTOCOL*This,\r
   IN EFI_GUID         *InformationType,\r
   IN UINTN            BufferSize,\r
   IN VOID             *Buffer\r
@@ -1717,7 +1724,7 @@ Returns:
   UINTN                             OldInfoSize;\r
   EFI_TPL                           OldTpl;\r
   mode_t                            NewAttr;\r
-  struct stat                       OldAttr;\r
+  STAT_FIX                          OldAttr;\r
   CHAR8                             *OldFileName;\r
   CHAR8                             *NewFileName;\r
   CHAR8                             *CharPointer;\r
@@ -1816,7 +1823,7 @@ Returns:
   //\r
   NewFileInfo = (EFI_FILE_INFO *) Buffer;\r
 \r
-  if (NewFileInfo->Size <= sizeof (EFI_FILE_INFO) ||\r
+  if ((NewFileInfo->Size <= SIZE_OF_EFI_FILE_INFO) ||\r
       (NewFileInfo->Attribute &~(EFI_FILE_VALID_ATTR)) ||\r
       (sizeof (UINTN) == 4 && NewFileInfo->Size > 0xFFFFFFFF)\r
       ) {\r
@@ -1843,7 +1850,7 @@ Returns:
   }\r
 \r
   Status = gBS->AllocatePool (EfiBootServicesData, OldInfoSize,\r
-                             (VOID **)&OldFileInfo);\r
+            (VOID **)&OldFileInfo);\r
 \r
   if (EFI_ERROR (Status)) {\r
     goto Done;\r
@@ -1888,7 +1895,7 @@ Returns:
   } else {\r
     Status = gBS->AllocatePool (\r
                     EfiBootServicesData,\r
-                    AsciiStrLen (PrivateFile->FileName) + 1 + StrLen (NewFileInfo->FileName) + 1,\r
+                    AsciiStrLen (PrivateFile->FileName) + 2 + StrLen (NewFileInfo->FileName) + 1,\r
                     (VOID **)&NewFileName\r
                     );\r
 \r
@@ -1898,8 +1905,11 @@ Returns:
 \r
     AsciiStrCpy (NewFileName, PrivateRoot->FilePath);\r
     AsciiFilePtr = NewFileName + AsciiStrLen(NewFileName);\r
-    while (AsciiFilePtr > NewFileName && AsciiFilePtr[-1] != '/') {\r
-      AsciiFilePtr--;\r
+    if ((AsciiFilePtr[-1] != '/') && (NewFileInfo->FileName[0] != '/')) {\r
+      // make sure there is a / between Root FilePath and NewFileInfo Filename\r
+      AsciiFilePtr[0] = '/';      \r
+      AsciiFilePtr[1] = '\0';\r
+      AsciiFilePtr++;\r
     }\r
     UnicodeFilePtr = NewFileInfo->FileName;\r
   }\r
@@ -2084,7 +2094,6 @@ Returns:
   }\r
 \r
   UnixStatus = PrivateFile->UnixThunk->Chmod (NewFileName, NewAttr);\r
-\r
   if (UnixStatus != 0) {\r
     Status    = EFI_DEVICE_ERROR;\r
   }\r
@@ -2110,7 +2119,7 @@ Done:
 EFI_STATUS\r
 EFIAPI\r
 UnixSimpleFileSystemFlush (\r
-  IN EFI_FILE  *This\r
+  IN EFI_FILE_PROTOCOL  *This\r
   )\r
 /*++\r
 \r