ID:               35079
 Updated by:       [EMAIL PROTECTED]
 Reported By:      askalski at gmail dot com
 Status:           Assigned
 Bug Type:         Filesystem function related
 Operating System: linux
 PHP Version:      5CVS-2005-11-03 (snap)
 Assigned To:      wez
 New Comment:

Wez, the proposed solution looks good to me.
Please check it out.


Previous Comments:
------------------------------------------------------------------------

[2005-11-03 21:43:31] [EMAIL PROTECTED]

Assigned to the author of streams.

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

[2005-11-03 18:56:39] askalski at gmail dot com

Still broken. (php-200511031730)

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

[2005-11-03 15:48:11] [EMAIL PROTECTED]

Please try using this CVS snapshot:

  http://snaps.php.net/php5-latest.tar.gz
 
For Windows:
 
  http://snaps.php.net/win32/php5-win32-latest.zip



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

[2005-11-03 05:55:11] askalski at gmail dot com

Description:
------------
main/streams/plain_wrapper.c (5.0.5)
main/streams.c (4.4 and earlier)

In several places, the ^= operator is used to turn off a flag.  This is
incorrect.  For example, stream_set_blocking() on a plain file hits this
code in php_stdiop_set_option():

if (value)
    flags ^= O_NONBLOCK;
else
    flags |= O_NONBLOCK;

This should be:

if (value)
    flags &= ~O_NONBLOCK;
else
    flags |= O_NONBLOCK;

The same error is repeated elsewhere in the code.


Reproduce code:
---------------
$fp = fopen("test", "w");

stream_set_blocking($fp, true);
stream_set_blocking($fp, true);
stream_set_blocking($fp, true);
stream_set_blocking($fp, true);

fclose($fp);


Expected result:
----------------
The stream should remain in blocking mode throughout the script
execution.


Actual result:
--------------
Here is abridged strace output showing the errant behavior.  Notice how
O_NONBLOCK is being turned on and off alternately.

open("/home/askalski/test", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 4
fcntl64(4, F_SETFL, O_WRONLY|O_NONBLOCK) = 0
fcntl64(4, F_SETFL, O_WRONLY)           = 0
fcntl64(4, F_SETFL, O_WRONLY|O_NONBLOCK) = 0
fcntl64(4, F_SETFL, O_WRONLY)           = 0
close(4)                                = 0



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


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

Reply via email to