helly Thu Jan 5 22:03:07 2006 UTC Modified files: (Branch: PHP_5_1) /php-src/main/streams memory.c Log: - Fix issue with memset seeking - Fix issue with shutdown order of temp/memory stream http://cvs.php.net/viewcvs.cgi/php-src/main/streams/memory.c?r1=1.8.2.4&r2=1.8.2.5&diff_format=u Index: php-src/main/streams/memory.c diff -u php-src/main/streams/memory.c:1.8.2.4 php-src/main/streams/memory.c:1.8.2.5 --- php-src/main/streams/memory.c:1.8.2.4 Sun Jan 1 12:50:18 2006 +++ php-src/main/streams/memory.c Thu Jan 5 22:03:07 2006 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: memory.c,v 1.8.2.4 2006/01/01 12:50:18 sniper Exp $ */ +/* $Id: memory.c,v 1.8.2.5 2006/01/05 22:03:07 helly Exp $ */ #define _GNU_SOURCE #include "php.h" @@ -39,6 +39,7 @@ size_t fsize; size_t smax; int mode; + php_stream **owner_ptr; } php_stream_memory_data; @@ -118,6 +119,9 @@ if (ms->data && close_handle && ms->mode != TEMP_STREAM_READONLY) { efree(ms->data); } + if (ms->owner_ptr) { + *ms->owner_ptr = NULL; + } efree(ms); return 0; } @@ -147,44 +151,51 @@ if (offset < 0) { if (ms->fpos < (size_t)(-offset)) { ms->fpos = 0; - /*return EINVAL;*/ + *newoffs = -1; + return -1; } else { ms->fpos = ms->fpos + offset; + *newoffs = ms->fpos; + return 0; } } else { if (ms->fpos < (size_t)(offset)) { ms->fpos = ms->fsize; - /*return EINVAL;*/ + *newoffs = -1; + return -1; } else { ms->fpos = ms->fpos + offset; + *newoffs = ms->fpos; + return 0; } } - *newoffs = ms->fpos; - return 0; case SEEK_SET: if (ms->fsize < (size_t)(offset)) { ms->fpos = ms->fsize; - /*return EINVAL;*/ + *newoffs = -1; + return -1; } else { ms->fpos = offset; + *newoffs = ms->fpos; + return 0; } - *newoffs = ms->fpos; - return 0; case SEEK_END: if (offset > 0) { ms->fpos = ms->fsize; - /*return EINVAL;*/ - } else if (ms->fpos < (size_t)(-offset)) { + *newoffs = -1; + return -1; + } else if (ms->fsize < (size_t)(-offset)) { ms->fpos = 0; - /*return EINVAL;*/ + *newoffs = -1; + return -1; } else { ms->fpos = ms->fsize + offset; + *newoffs = ms->fpos; + return 0; } - *newoffs = ms->fpos; - return 0; default: - return 0; - /*return EINVAL;*/ + *newoffs = ms->fpos; + return -1; } } /* }}} */ @@ -220,6 +231,7 @@ self->fsize = 0; self->smax = -1; self->mode = mode; + self->owner_ptr = NULL; stream = php_stream_alloc(&php_stream_memory_ops, self, 0, mode & TEMP_STREAM_READONLY ? "r+b" : "w+b"); stream->flags |= PHP_STREAM_FLAG_NO_BUFFER; @@ -288,6 +300,9 @@ ts = stream->abstract; assert(ts != NULL); + if (!ts->innerstream) { + return -1; + } if (php_stream_is(ts->innerstream, PHP_STREAM_IS_MEMORY)) { size_t memsize; char *membuf = php_stream_memory_get_buffer(ts->innerstream, &memsize); @@ -314,6 +329,10 @@ ts = stream->abstract; assert(ts != NULL); + if (!ts->innerstream) { + return -1; + } + got = php_stream_read(ts->innerstream, buf, count); if (!got) { @@ -335,7 +354,11 @@ ts = stream->abstract; assert(ts != NULL); - ret = php_stream_free(ts->innerstream, PHP_STREAM_FREE_CLOSE | (close_handle ? 0 : PHP_STREAM_FREE_PRESERVE_HANDLE)); + if (ts->innerstream) { + ret = php_stream_free(ts->innerstream, PHP_STREAM_FREE_CLOSE | (close_handle ? 0 : PHP_STREAM_FREE_PRESERVE_HANDLE)); + } else { + ret = 0; + } efree(ts); @@ -353,7 +376,7 @@ ts = stream->abstract; assert(ts != NULL); - return php_stream_flush(ts->innerstream); + return ts->innerstream ? php_stream_flush(ts->innerstream) : -1; } /* }}} */ @@ -368,6 +391,10 @@ ts = stream->abstract; assert(ts != NULL); + if (!ts->innerstream) { + *newoffs = -1; + return -1; + } ret = php_stream_seek(ts->innerstream, offset, whence); *newoffs = php_stream_tell(ts->innerstream); @@ -388,6 +415,9 @@ ts = stream->abstract; assert(ts != NULL); + if (!ts->innerstream) { + return FAILURE; + } if (php_stream_is(ts->innerstream, PHP_STREAM_IS_STDIO)) { return php_stream_cast(ts->innerstream, castas, ret, 0); } @@ -444,6 +474,7 @@ stream = php_stream_alloc(&php_stream_temp_ops, self, 0, mode & TEMP_STREAM_READONLY ? "r+b" : "w+b"); stream->flags |= PHP_STREAM_FLAG_NO_BUFFER; self->innerstream = php_stream_memory_create(mode); + ((php_stream_memory_data*)self->innerstream->abstract)->owner_ptr = &self->innerstream; return stream; }
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php