|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
[2005-11-03 18:56 UTC] askalski at gmail dot com
[2005-11-03 21:43 UTC] sniper@php.net
[2005-11-11 22:32 UTC] tony2001@php.net
[2005-11-17 15:20 UTC] tony2001@php.net
|
|||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Thu Oct 23 08:00:02 2025 UTC |
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