tony2001 Wed Jun 21 14:38:28 2006 UTC Added files: (Branch: PHP_5_2) /php-src/ext/bz2/tests 001.phpt 002.phpt
Modified files: /php-src/ext/bz2 bz2.c Log: MFH: improve check for stream mode, add tests http://cvs.php.net/viewvc.cgi/php-src/ext/bz2/bz2.c?r1=1.14.2.3.2.3&r2=1.14.2.3.2.4&diff_format=u Index: php-src/ext/bz2/bz2.c diff -u php-src/ext/bz2/bz2.c:1.14.2.3.2.3 php-src/ext/bz2/bz2.c:1.14.2.3.2.4 --- php-src/ext/bz2/bz2.c:1.14.2.3.2.3 Wed Jun 21 13:12:37 2006 +++ php-src/ext/bz2/bz2.c Wed Jun 21 14:38:28 2006 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: bz2.c,v 1.14.2.3.2.3 2006/06/21 13:12:37 tony2001 Exp $ */ +/* $Id: bz2.c,v 1.14.2.3.2.4 2006/06/21 14:38:28 tony2001 Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -381,19 +381,39 @@ } else { /* If it is a resource, than its a stream resource */ int fd; + int stream_mode_len; php_stream_from_zval(stream, file); + stream_mode_len = strlen(stream->mode); + + if (stream_mode_len != 1 && !(stream_mode_len == 2 && memchr(stream->mode, 'b', 2))) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "cannot use stream opened in mode '%s'", stream->mode); + RETURN_FALSE; + } else if (stream_mode_len == 1 && stream->mode[0] != 'r' && stream->mode[0] != 'w' && stream->mode[0] != 'a' && stream->mode[0] != 'x') { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "cannot use stream opened in mode '%s'", stream->mode); + RETURN_FALSE; + } - if (!memchr(stream->mode, Z_STRVAL_PP(mode)[0], strlen(stream->mode))) { - switch (Z_STRVAL_PP(mode)[0]) { - case 'r': + switch(Z_STRVAL_PP(mode)[0]) { + case 'r': + /* only "r" and "rb" are supported */ + if (stream->mode[0] != Z_STRVAL_PP(mode)[0] && !(stream_mode_len == 2 && stream->mode[1] != Z_STRVAL_PP(mode)[0])) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "cannot read from a stream opened in write only mode"); - break; - case 'w': + RETURN_FALSE; + } + break; + case 'w': + /* support only "w"(b), "a"(b), "x"(b) */ + if (stream->mode[0] != Z_STRVAL_PP(mode)[0] && !(stream_mode_len == 2 && stream->mode[1] != Z_STRVAL_PP(mode)[0]) + && stream->mode[0] != 'a' && !(stream_mode_len == 2 && stream->mode[1] != 'a') + && stream->mode[0] != 'x' && !(stream_mode_len == 2 && stream->mode[1] != 'x')) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "cannot write to a stream opened in read only mode"); - break; - } - RETURN_FALSE; + RETURN_FALSE; + } + break; + default: + /* not reachable */ + break; } if (FAILURE == php_stream_cast(stream, PHP_STREAM_AS_FD, (void *) &fd, REPORT_ERRORS)) { http://cvs.php.net/viewvc.cgi/php-src/ext/bz2/tests/001.phpt?view=markup&rev=1.1 Index: php-src/ext/bz2/tests/001.phpt +++ php-src/ext/bz2/tests/001.phpt --TEST-- bzopen() and invalid parameters --FILE-- <?php var_dump(bzopen()); var_dump(bzopen("", "")); var_dump(bzopen("", "r")); var_dump(bzopen("", "w")); var_dump(bzopen("", "x")); var_dump(bzopen("", "rw")); var_dump(bzopen("no_such_file", "r")); $fp = fopen(__FILE__,"r"); var_dump(bzopen($fp, "r")); echo "Done\n"; ?> --EXPECTF-- Warning: Wrong parameter count for bzopen() in %s on line %d NULL Warning: bzopen(): '' is not a valid mode for bzopen(). Only 'w' and 'r' are supported. in %s on line %d bool(false) Warning: bzopen(): filename cannot be empty in %s on line %d bool(false) Warning: bzopen(): filename cannot be empty in %s on line %d bool(false) Warning: bzopen(): 'x' is not a valid mode for bzopen(). Only 'w' and 'r' are supported. in %s on line %d bool(false) Warning: bzopen(): 'rw' is not a valid mode for bzopen(). Only 'w' and 'r' are supported. in %s on line %d bool(false) Warning: bzopen(no_such_file): failed to open stream: No such file or directory in %s on line %d bool(false) resource(%d) of type (stream) Done http://cvs.php.net/viewvc.cgi/php-src/ext/bz2/tests/002.phpt?view=markup&rev=1.1 Index: php-src/ext/bz2/tests/002.phpt +++ php-src/ext/bz2/tests/002.phpt --TEST-- bzopen() using fd opened in wrong mode --FILE-- <?php @unlink("bz_open_002.txt"); $fp = fopen("bz_open_002.txt", "w"); var_dump(bzopen($fp, "w")); $fp = fopen("bz_open_002.txt", "r"); var_dump(bzopen($fp, "r")); @unlink("bz_open_002.txt"); $fp = fopen("bz_open_002.txt", "x"); var_dump(bzopen($fp, "w")); @unlink("bz_open_002.txt"); $fp = fopen("bz_open_002.txt", "x"); var_dump(bzopen($fp, "r")); $fp = fopen("bz_open_002.txt", "rb"); var_dump(bzopen($fp, "r")); $fp = fopen("bz_open_002.txt", "wb"); var_dump(bzopen($fp, "w")); $fp = fopen("bz_open_002.txt", "br"); var_dump(bzopen($fp, "r")); $fp = fopen("bz_open_002.txt", "br"); var_dump(bzopen($fp, "w")); $fp = fopen("bz_open_002.txt", "r"); var_dump(bzopen($fp, "w")); $fp = fopen("bz_open_002.txt", "w"); var_dump(bzopen($fp, "r")); $fp = fopen("bz_open_002.txt", "rw"); var_dump(bzopen($fp, "w")); $fp = fopen("bz_open_002.txt", "rw"); var_dump(bzopen($fp, "r")); $fp = fopen("bz_open_002.txt", "wr"); var_dump(bzopen($fp, "w")); $fp = fopen("bz_open_002.txt", "wr"); var_dump(bzopen($fp, "r")); $fp = fopen("bz_open_002.txt", "r+"); var_dump(bzopen($fp, "r")); $fp = fopen("bz_open_002.txt", "r+"); var_dump(bzopen($fp, "w")); $fp = fopen("bz_open_002.txt", "w+"); var_dump(bzopen($fp, "r")); $fp = fopen("bz_open_002.txt", "w+"); var_dump(bzopen($fp, "w")); $fp = fopen("bz_open_002.txt", "a"); var_dump(bzopen($fp, "r")); $fp = fopen("bz_open_002.txt", "a"); var_dump(bzopen($fp, "w")); @unlink("bz_open_002.txt"); echo "Done\n"; ?> --EXPECTF-- resource(%d) of type (stream) resource(%d) of type (stream) resource(%d) of type (stream) Warning: bzopen(): cannot read from a stream opened in write only mode in %s on line %d bool(false) resource(%d) of type (stream) resource(%d) of type (stream) Warning: fopen(bz_open_002.txt): failed to open stream: Bad file descriptor in %s on line %d Warning: bzopen(): filename cannot be empty in %s on line %d bool(false) Warning: fopen(bz_open_002.txt): failed to open stream: Bad file descriptor in %s on line %d Warning: bzopen(): filename cannot be empty in %s on line %d bool(false) Warning: bzopen(): cannot write to a stream opened in read only mode in %s on line %d bool(false) Warning: bzopen(): cannot read from a stream opened in write only mode in %s on line %d bool(false) Warning: bzopen(): cannot use stream opened in mode 'rw' in %s on line %d bool(false) Warning: bzopen(): cannot use stream opened in mode 'rw' in %s on line %d bool(false) Warning: bzopen(): cannot use stream opened in mode 'wr' in %s on line %d bool(false) Warning: bzopen(): cannot use stream opened in mode 'wr' in %s on line %d bool(false) Warning: bzopen(): cannot use stream opened in mode 'r+' in %s on line %d bool(false) Warning: bzopen(): cannot use stream opened in mode 'r+' in %s on line %d bool(false) Warning: bzopen(): cannot use stream opened in mode 'w+' in %s on line %d bool(false) Warning: bzopen(): cannot use stream opened in mode 'w+' in %s on line %d bool(false) Warning: bzopen(): cannot read from a stream opened in write only mode in %s on line %d bool(false) resource(%d) of type (stream) Done -- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php