|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2012-10-08 16:03 UTC] scope at planetavent dot de
Description: ------------ On specific file input stream_get_line returns a "line" that actually contains the delimiter. PHP 5.3.10 does not show this problem, PHP versions from 5.3.11 to 5.3.17 do. PHP 5.4.7 seems to be affected as well. Bug #44607 seems to be related, but was fixed long time ago. Test script: --------------- <?php $file = __DIR__ . '/input_dummy.txt'; $data = str_repeat( '.', 8184 ) . 'MM' . str_repeat( '.', 8190 ) . 'MM' . str_repeat( '.', 8128 ) . 'MM' . str_repeat( '.', 61 ) . 'MM' . str_repeat( '.', 20 ); file_put_contents( $file, $data ); $fh = fopen( $file, "rb" ); $delimiter = "MM"; while ( !feof( $fh ) ) { $before = ftell( $fh ); $line = stream_get_line( $fh, 4096, $delimiter ); $after = ftell( $fh ); if ( strpos( $line, $delimiter ) !== false ) { echo "found delimiter in return! ($before / $after)\n$line"; exit; } } echo "ok\n"; Expected result: ---------------- ok Actual result: -------------- found delimiter in return! (24508 / 24591) .............................................................MM.................... Patchesgetrecord-delimiter-search-fix (last revision 2012-10-09 09:02 UTC by datibbaw@php.net)Pull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Fri Oct 31 23:00:01 2025 UTC |
Reduced test: $file = __DIR__ . '/input_dummy.txt'; $data = str_repeat( '.', 8189 ) . 'MMMM'; file_put_contents( $file, $data ); $fh = fopen( $file, "rb" ); $delimiter = "MM"; stream_get_line($fh, 4096, $delimiter); stream_get_line($fh, 4096, $delimiter); if ($delimiter === stream_get_line($fh, 4096, $delimiter)) { echo "BROKEN"; } else { echo "OK"; } fclose($fh); unlink($file); The amount of dots seems to be related to the used buffer length: (<number-of-dots> + 3) % (<buffer-length> x 2) == 0 The length of the delimiter also seems to play a role, but I'm not sure what that would be.Thanks, I'll commit this tomorrow. As to your other comment on the list about the bool(false) return instead of an empty string for an empty file, that was a bug fix. A return of "" would indicate an empty line. The result is now corect: $ php -r '$fd = fopen("php://temp", "r+"); var_dump(stream_get_line($fd, 10, "MM"));' bool(false) $ php -r '$fd = fopen("php://temp", "r+"); fwrite($fd, "MM"); rewind($fd); var_dump(stream_get_line($fd, 10, "MM"), stream_get_line($fd, 10, "MM")); string(0) "" bool(false)