wez Sun Dec 22 13:05:36 2002 EDT
Modified files:
/php4/ext/standard/tests/file userstreams.phpt
/php4/main streams.c
Log:
Fix for Bug #21131: fopen($file, 'a+') would incorrectly assume that
the stream position was at offset 0.
This corrects that assumption by querying the stream for it's position
when it detects the 'a' "flag" in the mode parameter to fopen.
Also added a test for plain files and amended the userstreams test to
take this into account.
Index: php4/ext/standard/tests/file/userstreams.phpt
diff -u php4/ext/standard/tests/file/userstreams.phpt:1.8
php4/ext/standard/tests/file/userstreams.phpt:1.9
--- php4/ext/standard/tests/file/userstreams.phpt:1.8 Tue Oct 29 09:36:49 2002
+++ php4/ext/standard/tests/file/userstreams.phpt Sun Dec 22 13:05:36 2002
@@ -97,7 +97,11 @@
$split = parse_url($path);
$this->varname = $split["host"];
- $this->position = 0;
+
+ if (strchr($mode, 'a'))
+ $this->position = strlen($GLOBALS[$this->varname]);
+ else
+ $this->position = 0;
return true;
}
@@ -301,6 +305,15 @@
if ($fail_count == 0) {
echo "FGETS: OK\n";
}
+
+/* One final test to see if the position is respected when opened for append */
+$fp = fopen("test://lyrics", "a+");
+rewind($fp);
+var_dump(ftell($fp));
+$data = fgets($fp);
+fclose($fp);
+echo $data . "\n";
+
?>
--EXPECT--
Not Registered
@@ -308,3 +321,5 @@
Registered
SEEK: OK
FGETS: OK
+int(0)
+...and the road becomes my bride
Index: php4/main/streams.c
diff -u php4/main/streams.c:1.136 php4/main/streams.c:1.137
--- php4/main/streams.c:1.136 Thu Dec 19 15:23:50 2002
+++ php4/main/streams.c Sun Dec 22 13:05:36 2002
@@ -20,7 +20,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: streams.c,v 1.136 2002/12/19 20:23:50 wez Exp $ */
+/* $Id: streams.c,v 1.137 2002/12/22 18:05:36 wez Exp $ */
#define _GNU_SOURCE
#include "php.h"
@@ -1317,8 +1317,12 @@
stream = php_stream_alloc_rel(&php_stream_stdio_ops, self, 0, mode);
- if (stream && self->is_pipe) {
- stream->flags |= PHP_STREAM_FLAG_NO_SEEK;
+ if (stream) {
+ if (self->is_pipe) {
+ stream->flags |= PHP_STREAM_FLAG_NO_SEEK;
+ } else {
+ stream->position = ftell(file);
+ }
}
return stream;
@@ -2412,6 +2416,16 @@
}
}
}
+
+ if (stream && stream->ops->seek && (stream->flags & PHP_STREAM_FLAG_NO_SEEK)
+== 0 && strchr(mode, 'a')) {
+ fpos_t newpos = 0;
+
+ /* if opened for append, we need to revise our idea of the initial
+file position */
+ if (0 == stream->ops->seek(stream, 0, SEEK_CUR, &newpos TSRMLS_CC)) {
+ stream->position = newpos;
+ }
+ }
+
if (stream == NULL && (options & REPORT_ERRORS)) {
display_wrapper_errors(wrapper, path, "failed to create stream"
TSRMLS_CC);
}
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php