wez Mon Feb 24 16:40:24 2003 EDT
Modified files:
/php4/ext/standard file.c
/php4/main php_streams.h
/php4/main/streams cast.c plain_wrapper.c streams.c
Log:
MFB: Bunch of streams related fixes.
Index: php4/ext/standard/file.c
diff -u php4/ext/standard/file.c:1.310 php4/ext/standard/file.c:1.311
--- php4/ext/standard/file.c:1.310 Sun Feb 23 22:13:25 2003
+++ php4/ext/standard/file.c Mon Feb 24 16:40:23 2003
@@ -21,7 +21,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: file.c,v 1.310 2003/02/24 03:13:25 iliaa Exp $ */
+/* $Id: file.c,v 1.311 2003/02/24 21:40:23 wez Exp $ */
/* Synced with php 3.0 revision 1.218 1999-06-16 [ssb] */
@@ -2384,7 +2384,7 @@
int ret = FAILURE;
srcstream = php_stream_open_wrapper(src, "rb",
- ENFORCE_SAFE_MODE | REPORT_ERRORS,
+ STREAM_DISABLE_OPEN_BASEDIR | REPORT_ERRORS,
NULL);
if (!srcstream) {
Index: php4/main/php_streams.h
diff -u php4/main/php_streams.h:1.71 php4/main/php_streams.h:1.72
--- php4/main/php_streams.h:1.71 Mon Feb 17 20:22:21 2003
+++ php4/main/php_streams.h Mon Feb 24 16:40:23 2003
@@ -16,7 +16,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: php_streams.h,v 1.71 2003/02/18 01:22:21 wez Exp $ */
+/* $Id: php_streams.h,v 1.72 2003/02/24 21:40:23 wez Exp $ */
#ifndef PHP_STREAMS_H
#define PHP_STREAMS_H
@@ -405,6 +405,9 @@
/* this flag is used when only the headers from HTTP request are to be fetched */
#define STREAM_ONLY_GET_HEADERS 512
+
+/* don't apply open_basedir checks */
+#define STREAM_DISABLE_OPEN_BASEDIR 1024
/* Antique - no longer has meaning */
#define IGNORE_URL_WIN 0
Index: php4/main/streams/cast.c
diff -u php4/main/streams/cast.c:1.3 php4/main/streams/cast.c:1.4
--- php4/main/streams/cast.c:1.3 Wed Feb 19 03:40:19 2003
+++ php4/main/streams/cast.c Mon Feb 24 16:40:23 2003
@@ -16,7 +16,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: cast.c,v 1.3 2003/02/19 08:40:19 sniper Exp $ */
+/* $Id: cast.c,v 1.4 2003/02/24 21:40:23 wez Exp $ */
#define _GNU_SOURCE
#include "php.h"
@@ -208,7 +208,12 @@
return FAILURE;
#endif
- if (flags & PHP_STREAM_CAST_TRY_HARD) {
+ if (!php_stream_is_filtered(stream) && stream->ops->cast &&
stream->ops->cast(stream, castas, NULL TSRMLS_CC) == SUCCESS) {
+ if (FAILURE == stream->ops->cast(stream, castas, ret
TSRMLS_CC)) {
+ return FAILURE;
+ }
+ goto exit_success;
+ } else if (flags & PHP_STREAM_CAST_TRY_HARD) {
php_stream *newstream;
newstream = php_stream_fopen_tmpfile();
Index: php4/main/streams/plain_wrapper.c
diff -u php4/main/streams/plain_wrapper.c:1.2 php4/main/streams/plain_wrapper.c:1.3
--- php4/main/streams/plain_wrapper.c:1.2 Wed Feb 19 03:40:19 2003
+++ php4/main/streams/plain_wrapper.c Mon Feb 24 16:40:23 2003
@@ -16,7 +16,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: plain_wrapper.c,v 1.2 2003/02/19 08:40:19 sniper Exp $ */
+/* $Id: plain_wrapper.c,v 1.3 2003/02/24 21:40:23 wez Exp $ */
#include "php.h"
#include "php_globals.h"
@@ -603,7 +603,7 @@
DIR *dir = NULL;
php_stream *stream = NULL;
- if (php_check_open_basedir(path TSRMLS_CC)) {
+ if ((options & STREAM_DISABLE_OPEN_BASEDIR == 0) &&
php_check_open_basedir(path TSRMLS_CC)) {
return NULL;
}
@@ -637,7 +637,7 @@
return php_stream_fopen_with_path_rel(path, mode, PG(include_path),
opened_path, options);
}
- if (php_check_open_basedir(path TSRMLS_CC)) {
+ if ((options & STREAM_DISABLE_OPEN_BASEDIR == 0) &&
php_check_open_basedir(path TSRMLS_CC)) {
return NULL;
}
@@ -702,7 +702,7 @@
}
- if (php_check_open_basedir(filename TSRMLS_CC)) {
+ if ((options & STREAM_DISABLE_OPEN_BASEDIR == 0) &&
php_check_open_basedir(filename TSRMLS_CC)) {
return NULL;
}
@@ -722,7 +722,7 @@
/* Absolute path open */
if (IS_ABSOLUTE_PATH(filename, filename_length)) {
- if (php_check_open_basedir(filename TSRMLS_CC)) {
+ if ((options & STREAM_DISABLE_OPEN_BASEDIR == 0) &&
php_check_open_basedir(filename TSRMLS_CC)) {
return NULL;
}
@@ -748,7 +748,7 @@
free(cwd);
- if (php_check_open_basedir(trypath TSRMLS_CC)) {
+ if ((options & STREAM_DISABLE_OPEN_BASEDIR == 0) &&
php_check_open_basedir(trypath TSRMLS_CC)) {
return NULL;
}
if ((php_check_safe_mode_include_dir(trypath TSRMLS_CC)) == 0) {
@@ -764,7 +764,7 @@
if (!path || (path && !*path)) {
- if (php_check_open_basedir(path TSRMLS_CC)) {
+ if ((options & STREAM_DISABLE_OPEN_BASEDIR == 0) &&
php_check_open_basedir(path TSRMLS_CC)) {
return NULL;
}
@@ -809,7 +809,7 @@
}
snprintf(trypath, MAXPATHLEN, "%s/%s", ptr, filename);
- if (php_check_open_basedir(trypath TSRMLS_CC)) {
+ if ((options & STREAM_DISABLE_OPEN_BASEDIR == 0) &&
php_check_open_basedir(trypath TSRMLS_CC)) {
stream = NULL;
goto stream_done;
}
Index: php4/main/streams/streams.c
diff -u php4/main/streams/streams.c:1.5 php4/main/streams/streams.c:1.6
--- php4/main/streams/streams.c:1.5 Wed Feb 19 03:40:19 2003
+++ php4/main/streams/streams.c Mon Feb 24 16:40:23 2003
@@ -19,7 +19,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: streams.c,v 1.5 2003/02/19 08:40:19 sniper Exp $ */
+/* $Id: streams.c,v 1.6 2003/02/24 21:40:23 wez Exp $ */
#define _GNU_SOURCE
#include "php.h"
@@ -801,6 +801,16 @@
{
size_t didwrite = 0, towrite, justwrote;
+ /* if we have a seekable stream we need to ensure that data is written at the
+ * current stream->position. This means invalidating the read buffer and then
+ * performing a low-level seek */
+ if (stream->ops->seek && (stream->flags & PHP_STREAM_FLAG_NO_SEEK) == 0) {
+ stream->readpos = stream->writepos = 0;
+
+ stream->ops->seek(stream, stream->position, SEEK_SET,
&stream->position TSRMLS_CC);
+ }
+
+
while (count > 0) {
towrite = count;
if (towrite > stream->chunk_size)
@@ -817,8 +827,6 @@
* buffered from fifos and sockets */
if (stream->ops->seek && (stream->flags &
PHP_STREAM_FLAG_NO_SEEK) == 0 && !php_stream_is_filtered(stream)) {
stream->position += justwrote;
- stream->writepos = 0;
- stream->readpos = 0;
}
} else {
break;
@@ -947,10 +955,6 @@
PHPAPI int _php_stream_seek(php_stream *stream, off_t offset, int whence TSRMLS_DC)
{
- /* not moving anywhere */
- if ((offset == 0 && whence == SEEK_CUR) || (offset == stream->position &&
whence == SEEK_SET))
- return 0;
-
/* handle the case where we are in the buffer */
if ((stream->flags & PHP_STREAM_FLAG_NO_BUFFER) == 0) {
switch(whence) {
@@ -974,8 +978,6 @@
}
}
- /* invalidate the buffer contents */
- stream->readpos = stream->writepos = 0;
if (stream->ops->seek && (stream->flags & PHP_STREAM_FLAG_NO_SEEK) == 0) {
int ret;
@@ -995,6 +997,10 @@
if (((stream->flags & PHP_STREAM_FLAG_NO_SEEK) == 0) || ret == 0) {
if (ret == 0)
stream->eof = 0;
+
+ /* invalidate the buffer contents */
+ stream->readpos = stream->writepos = 0;
+
return ret;
}
/* else the stream has decided that it can't support seeking after all;
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php