Use pread() to read DOS/NT headers when mapping PE files (#25059)
authorLeandro A. F. Pereira <leandro.pereira@microsoft.com>
Mon, 10 Jun 2019 22:44:29 +0000 (15:44 -0700)
committerJan Vorlicek <janvorli@microsoft.com>
Mon, 10 Jun 2019 22:44:29 +0000 (00:44 +0200)
Shaves off two syscalls per managed assembly load.

src/pal/src/map/map.cpp

index 7e6c89b..ba764c0 100644 (file)
@@ -2255,25 +2255,13 @@ void * MAPMapPEFile(HANDLE hFile)
     //Step 1: Read the PE headers and reserve enough space for the whole image somewhere.
     IMAGE_DOS_HEADER dosHeader;
     IMAGE_NT_HEADERS ntHeader;
-    errno = 0;
-    if (0 != lseek(fd, 0, SEEK_SET))
-    {
-        palError = FILEGetLastErrorFromErrno();
-        ERROR_(LOADER)( "lseek failed\n" );
-        goto done;
-    }
-    if (sizeof(dosHeader) != read(fd, &dosHeader, sizeof(dosHeader)))
+    if (sizeof(dosHeader) != pread(fd, &dosHeader, sizeof(dosHeader), 0))
     {
         palError = FILEGetLastErrorFromErrno();
         ERROR_(LOADER)( "reading dos header failed\n" );
         goto done;
     }
-    if (dosHeader.e_lfanew != lseek(fd, dosHeader.e_lfanew, SEEK_SET))
-    {
-        palError = FILEGetLastErrorFromErrno();
-        goto done;
-    }
-    if (sizeof(ntHeader) != read(fd, &ntHeader, sizeof(ntHeader)))
+    if (sizeof(ntHeader) != pread(fd, &ntHeader, sizeof(ntHeader), dosHeader.e_lfanew))
     {
         palError = FILEGetLastErrorFromErrno();
         goto done;