wez             Thu Sep 26 08:12:28 2002 EDT

  Modified files:              
    /php4/ext/standard  file.c file.h 
    /php4/main  streams.c user_streams.c 
  Log:
  Fix segfault in wrapper error log mechanism when errors are logged on
  second and subsequent events.
  Implement very simple recursion protection for user streams written
  like this:
  class urlEncodeStream {
      var $fp = NULL;
  
      function stream_open($path, $mode, $options, &$opened_path)
      {
          $this->fp = fopen($path, $mode); // <-- this recurses infinitely
          return is_resource($this->fp);
      }
  }
  
  file_register_wrapper('urlencode', 'urlEncodeStream');
  $fp = fopen('urlencode:///tmp/outputfile.txt', 'w');
  
  Noticed by: Yasuo.
  
  
  
Index: php4/ext/standard/file.c
diff -u php4/ext/standard/file.c:1.262 php4/ext/standard/file.c:1.263
--- php4/ext/standard/file.c:1.262      Thu Sep 26 06:17:40 2002
+++ php4/ext/standard/file.c    Thu Sep 26 08:12:26 2002
@@ -21,7 +21,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: file.c,v 1.262 2002/09/26 10:17:40 wez Exp $ */
+/* $Id: file.c,v 1.263 2002/09/26 12:12:26 wez Exp $ */
 
 /* Synced with php 3.0 revision 1.218 1999-06-16 [ssb] */
 
@@ -132,6 +132,7 @@
 static void file_globals_ctor(php_file_globals *file_globals_p TSRMLS_DC)
 {
        FG(pclose_ret) = 0;
+       FG(user_stream_current_filename) = NULL;
        FG(def_chunk_size) = PHP_SOCK_CHUNK_SIZE;
 }
 
Index: php4/ext/standard/file.h
diff -u php4/ext/standard/file.h:1.67 php4/ext/standard/file.h:1.68
--- php4/ext/standard/file.h:1.67       Thu Sep 26 06:17:40 2002
+++ php4/ext/standard/file.h    Thu Sep 26 08:12:27 2002
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: file.h,v 1.67 2002/09/26 10:17:40 wez Exp $ */
+/* $Id: file.h,v 1.68 2002/09/26 12:12:27 wez Exp $ */
 
 /* Synced with php 3.0 revision 1.30 1999-06-16 [ssb] */
 
@@ -115,6 +115,7 @@
        int auto_detect_line_endings;
        int default_socket_timeout;
        char *user_agent;
+       char *user_stream_current_filename; /* for simple recursion protection */
 } php_file_globals;
 
 #ifdef ZTS
Index: php4/main/streams.c
diff -u php4/main/streams.c:1.82 php4/main/streams.c:1.83
--- php4/main/streams.c:1.82    Wed Sep 25 11:25:12 2002
+++ php4/main/streams.c Thu Sep 26 08:12:27 2002
@@ -20,7 +20,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: streams.c,v 1.82 2002/09/25 15:25:12 wez Exp $ */
+/* $Id: streams.c,v 1.83 2002/09/26 12:12:27 wez Exp $ */
 
 #define _GNU_SOURCE
 #include "php.h"
@@ -1988,7 +1988,7 @@
                int free_msg = 0;
 
                if (wrapper) {
-                       if (wrapper->err_count) {
+                       if (wrapper->err_count > 0) {
                                int i;
                                size_t l;
                                int brlen;
@@ -2038,6 +2038,7 @@
                if (wrapper->err_stack)
                        efree(wrapper->err_stack);
                wrapper->err_stack = NULL;
+               wrapper->err_count = 0;
        }
 #if ZEND_DEBUG
        if (stream == NULL && copy_of_path != NULL)
Index: php4/main/user_streams.c
diff -u php4/main/user_streams.c:1.22 php4/main/user_streams.c:1.23
--- php4/main/user_streams.c:1.22       Mon Sep 23 14:18:40 2002
+++ php4/main/user_streams.c    Thu Sep 26 08:12:27 2002
@@ -17,10 +17,11 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: user_streams.c,v 1.22 2002/09/23 18:18:40 wez Exp $ */
+/* $Id: user_streams.c,v 1.23 2002/09/26 12:12:27 wez Exp $ */
 
 #include "php.h"
 #include "php_globals.h"
+#include "ext/standard/file.h"
 
 static int le_protocols;
 
@@ -137,6 +138,13 @@
        int call_result;
        php_stream *stream = NULL;
 
+       /* Try to catch bad usage without prevent flexibility */
+       if (FG(user_stream_current_filename) != NULL && strcmp(filename, 
+FG(user_stream_current_filename)) == 0) {
+               php_stream_wrapper_log_error(wrapper, options TSRMLS_CC, "infinite 
+recursion prevented");
+               return NULL;
+       }
+       FG(user_stream_current_filename) = filename;
+       
        us = emalloc(sizeof(*us));
        us->wrapper = uwrap;    
 
@@ -206,6 +214,8 @@
        zval_ptr_dtor(&zmode);
        zval_ptr_dtor(&zfilename);
 
+       FG(user_stream_current_filename) = NULL;
+               
        return stream;
 }
 



-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to