Edit report at https://bugs.php.net/bug.php?id=63709&edit=1

 ID:                 63709
 User updated by:    eric dot saintetienne at gmail dot com
 Reported by:        eric dot saintetienne at gmail dot com
 Summary:            flock() doesn't trigger mandatory locks on linux
 Status:             Open
 Type:               Bug
 Package:            Filesystem function related
 Operating System:   Linux
 PHP Version:        5.3.19
 Block user comment: N
 Private report:     N

 New Comment:

Note that dio_fcntl() of the "Direct IO" extension can successfully exclusively 
lock the file, but this shouldn't be considered as a workaround as it's not 
always 
possible to install extensions.

If flock() couldn't be modified for backward compatibility reasons, options 
could 
be added to alter its behaviour, or a new call lockf() would be welcome too.


Previous Comments:
------------------------------------------------------------------------
[2012-12-06 13:12:43] eric dot saintetienne at gmail dot com

Description:
------------
Locking exclusively via flock a file opened for writing doesn't trigger a 
mandatory lock.
The python script below could trigger the mandatory lock.

Maybe it's because PHP flock() is built on the C function call flock():
"When a program attempts to lock a file with lockf or fcntl that has mandatory 
locking set, the kernel will prevent all other programs from accessing the 
file. 
Processes which use flock will not trigger a mandatory lock."
source: http://www.hackinglinuxexposed.com/articles/20030623.html

Python script:
#!/usr/bin/python

import os, fcntl

fd = os.open('mandlock-file', os.O_RDWR, 0755)
print 'fd=', fd
fcntl.lockf(fd, fcntl.LOCK_EX)

a = raw_input() # during that time, any attempt to open the file will hang
os.write(fd, a+'\n')

fcntl.lockf(fd, fcntl.LOCK_UN)
# now any attempt to open the file will succeed

os.close(fd)

# eof

Test script:
---------------
<?php
define('FILENAME', 'mandlock-file');

/* first create a file with a mandatory lock:
 *   $ touch mandlock-file
 *   $ chmod g+s,g-x mandlock-file
 *   $ sudo mount -o remount,mand / # my file is inside the '/' mountpoint
*/

function openlockedfile($filename) {
  $fp = fopen($filename, 'w+');

  while (($fp === false) || (flock($fp, LOCK_EX) !== true)) {
    sleep(1);
    echo "spin lock\n";

    if ($fp === false)
      $fp = fopen($filename, 'w+');
  }
  return $fp;
}

$fd = openlockedfile(FILENAME); // open + lock EX

sleep(10);

/* During this sleep time, accessing the file should hang until the
 * php script releases the exclusive lock:
 *   $ cat mandlock-file # should hang until php script termination
 * Practically, cat doesn't hang (and works) proving the file isn't
 * exclusively locked by the PHP script. */

closefile($fd); // unlock + close

/* eof */
?>

Expected result:
----------------
once the file is created and the mandatory lock setup for it:
during the 10 sec timer, opening the file (with or without explicit locking) 
should hand until the php script terminates.

Actual result:
--------------
it's possible to opening the locked file during the 10s timer for reading and 
writing.


------------------------------------------------------------------------



-- 
Edit this bug report at https://bugs.php.net/bug.php?id=63709&edit=1

Reply via email to