Remove flock usage from InternalCreateFile in PAL (#16752)
authorJan Vorlicek <janvorli@microsoft.com>
Mon, 5 Mar 2018 15:15:24 +0000 (16:15 +0100)
committerJan Kotas <jkotas@microsoft.com>
Mon, 5 Mar 2018 15:15:24 +0000 (07:15 -0800)
This flock is causing issues on filesystems that don't support locking.
An issue with loading managed assemblies from such a filesystem due to
this issue was recently hit by someone.
Since the locking in the PAL is not really needed and due to the
advisory nature of the flock doesn't guarantee anything, this change is
removing the flock from that function.

src/pal/src/file/file.cpp

index be6b3426f37e190fad0865899024634286a536ae..b7bc78063656adbf9e407815ad605b2690b2c3ff 100644 (file)
@@ -490,7 +490,6 @@ CorUnix::InternalCreateFile(
     int   filed = -1;
     int   create_flags = (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
     int   open_flags = 0;
-    int   lock_mode = LOCK_SH;
 
     // track whether we've created the file with the intended name,
     // so that it can be removed on failure exit
@@ -701,29 +700,6 @@ CorUnix::InternalCreateFile(
                     dwCreationDisposition == OPEN_ALWAYS) &&
         !fFileExists;
 
-
-    // While the lock manager is able to provide support for share modes within an instance of
-    // the PAL, other PALs will ignore these locks.  In order to support a basic level of cross
-    // process locking, we'll use advisory locks.  FILE_SHARE_NONE implies a exclusive lock on the
-    // file and all other modes use a shared lock.  While this is not as granular as Windows,
-    // you can atleast implement a lock file using this.
-    lock_mode = (dwShareMode == 0 /* FILE_SHARE_NONE */) ? LOCK_EX : LOCK_SH;
-
-    if(flock(filed, lock_mode | LOCK_NB) != 0) 
-    {
-        TRACE("flock() failed; error is %s (%d)\n", strerror(errno), errno);
-        if (errno == EWOULDBLOCK) 
-        {
-            palError = ERROR_SHARING_VIOLATION;
-        }
-        else
-        {
-            palError = FILEGetLastErrorFromErrno();
-        }
-
-        goto done;
-    }
-
 #ifndef O_DIRECT
     if ( dwFlagsAndAttributes & FILE_FLAG_NO_BUFFERING )
     {