|  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #36741 userstreams testcase have off-by-one error on fseek()
Submitted: 2006-03-15 05:58 UTC Modified: 2006-03-20 23:09 UTC
From: elliot dot li at gmail dot com Assigned:
Status: Closed Package: Streams related
PHP Version: 5.1.2 OS: Linux
Private report: No CVE-ID: None
Welcome back! If you're the original bug submitter, here's where you can edit the bug or add additional notes.
If this is not your bug, you can add a comment by following this link.
If this is your bug, but you forgot your password, you can retrieve your password here.
Bug Type:
From: elliot dot li at gmail dot com
New email:
PHP Version: OS:


 [2006-03-15 05:58 UTC] elliot dot li at gmail dot com
This case(php-5.1.2/ext/standard/tests/file/userstreams.phpt) generates a bunch of random numbers and use them as offsets for fseek() test on a userstream. However, the range of these random numbers is [0, $DATALEN](rand(0, $DATALEN)), which should be [0, $DATALEN).

======== CODE SNIP FOLLOWS ========
/* generate some random seek offsets */
$position = 0;
for ($i = 0; $i < 256; $i++) {
        $whence = $whence_map[array_rand($whence_map, 1)];
        switch($whence) {
                case SEEK_SET:
                        $offset = rand(0, $DATALEN);
                        $position = $offset;
                case SEEK_END:
                        $offset = -rand(0, $DATALEN);
                        $position = $DATALEN + $offset;
                case SEEK_CUR:
                        $offset = rand(0, $DATALEN);
                        $offset -= $position;
                        $position += $offset;

        $seeks[] = array($whence, $offset, $position);
========  CODE SNIP ABOVE  ========

Reproduce code:
Run this case on and on for a while, you can encounter this problem. I found this problem during a regression test, and reproduced it on my PC(Pentium 4 2.6GHz) within one day.

Expected result:
No error should be reported if everything goes OK.

Actual result:
========= LOG SNIP FOLLOWS =========
--[34] whence=SEEK_SET offset=32550 line_length=1024 position_should_be=32550 --
REAL: pos=(29175,32550,32550) ret=0 line[0]=`'
USER: pos=(29175,29175,29175) ret=0 line[16]=`zl urnq vf ubzr
###################################### FAIL!
=========  LOG SNIP ABOVE  =========

32550 is the total length of the userstream, so fseek($fp, 32550, SEEK_SET) must fail.

I noticed another problem: mystream.stream_seek() would return a false on this condition, but the return value of fseek() is still 0! This would lead to the result that the failure of seeking in a userstream couldn't be noticed by the main program.


Add a Patch

Pull Requests

Add a Pull Request


AllCommentsChangesGit/SVN commitsRelated reports
 [2006-03-18 21:57 UTC]
Do you have a patch? (unified diff, please)
 [2006-03-20 01:43 UTC] elliot dot li at gmail dot com
Well, this is my patch. (sorry, I don't know how to append an attachment)

===== php-5.1.2-userstreams.test.patch FOLLOWS =====
diff -Nur php-5.1.2/ext/standard/tests/file/userstreams.phpt
--- php-5.1.2/ext/standard/tests/file/userstreams.phpt  2003-11-30 21:57:17.000000000 +0800
+++       2006-03-20 08:32:10.000000000 +0800
@@ -211,15 +211,15 @@
        $whence = $whence_map[array_rand($whence_map, 1)];
        switch($whence) {
                case SEEK_SET:
-                       $offset = rand(0, $DATALEN);
+                       $offset = rand(0, $DATALEN-1);
                        $position = $offset;
                case SEEK_END:
-                       $offset = -rand(0, $DATALEN);
+                       $offset = -rand(0, $DATALEN-1);
                        $position = $DATALEN + $offset;
                case SEEK_CUR:
-                       $offset = rand(0, $DATALEN);
+                       $offset = rand(0, $DATALEN-1);
                        $offset -= $position;
                        $position += $offset;
===== php-5.1.2-userstreams.test.patch ABOVE =====
 [2006-03-20 23:09 UTC]
This bug has been fixed in CVS.

Snapshots of the sources are packaged every three hours; this change
will be in the next snapshot. You can grab the snapshot at
Thank you for the report, and for helping us make PHP better.

 [2021-03-01 07:39 UTC] devendonaldson473 at gmail dot com
Thanks for the info i will try to figure it out for more
 [2021-12-13 09:21 UTC] mygroundbiz dot fun at gmail dot com
MyGroundBiz is a FedEx online official portal where customers can sign in to get the latest updated news and details on various factors. Customers in the United States just love spending time on this portal to get fruitful services. This is a highly encrypted portal that makes sure that each and every information stored about the users is extremely secure.
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Thu May 23 22:01:31 2024 UTC