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

Reply via email to