moriyoshi               Mon Oct 27 17:36:45 2003 EDT

  Modified files:              
    /php-src/ext/standard       file.c 
  Log:
  Fixed bug #26003 (fgetcsv() not binary-safe on null bytes)
  
  
Index: php-src/ext/standard/file.c
diff -u php-src/ext/standard/file.c:1.362 php-src/ext/standard/file.c:1.363
--- php-src/ext/standard/file.c:1.362   Sun Oct  5 09:59:15 2003
+++ php-src/ext/standard/file.c Mon Oct 27 17:36:44 2003
@@ -21,7 +21,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: file.c,v 1.362 2003/10/05 13:59:15 moriyoshi Exp $ */
+/* $Id: file.c,v 1.363 2003/10/27 22:36:44 moriyoshi Exp $ */
 
 /* Synced with php 3.0 revision 1.218 1999-06-16 [ssb] */
 
@@ -1723,10 +1723,11 @@
 static const char *php_fgetcsv_lookup_trailing_spaces(const char *ptr, size_t len, 
const char delimiter TSRMLS_DC)
 {
        int inc_len;
-       size_t cnt = 0;
+       unsigned char last_chars[2] = { 0, 0 };
 
        while (len > 0) {
-               switch ((inc_len = _php_mblen(ptr, len))) {
+               inc_len = (*ptr == '\0' ? 1: _php_mblen(ptr, len));
+               switch (inc_len) {
                        case -2:
                        case -1:
                                inc_len = 1;
@@ -1734,20 +1735,25 @@
                        case 0:
                                goto quit_loop;
                        case 1:
-                               if (delimiter != *ptr && isspace((int)*(const unsigned 
char *)ptr)) {
-                                       cnt++;
-                                       break;
-                               }
-                               /* break is omitted intentionally */
                        default:
-                               cnt = 0;
+                               last_chars[0] = last_chars[1];
+                               last_chars[1] = *ptr;
                                break;
                }
                ptr += inc_len;
                len -= inc_len;
        }
 quit_loop:
-       return ptr - cnt;
+       switch (last_chars[1]) {
+               case '\n':
+                       if (last_chars[0] == '\r') {
+                               return ptr - 2;
+                       }
+                       /* break is omitted intentionally */
+               case '\r':
+                       return ptr - 1;
+       }
+       return ptr;
 }
 
 /* {{{ proto array fgetcsv(resource fp [,int length [, string delimiter [, string 
enclosure]]])
@@ -1853,7 +1859,7 @@
 
                /* 1. Strip any leading space */
                for (;;) {
-                       inc_len = (bptr < limit ? _php_mblen(bptr, limit - bptr): 0);
+                       inc_len = (bptr < limit ? (*bptr == '\0' ? 1: _php_mblen(bptr, 
limit - bptr)): 0);
                        switch (inc_len) {
                                case -2:
                                case -1:
@@ -1882,7 +1888,7 @@
 
                        /* 2A. handle enclosure delimited field */
                        for (;;) {
-                               inc_len = (bptr < limit ? _php_mblen(bptr, limit - 
bptr): 0);
+                               inc_len = (bptr < limit ? (*bptr == '\0' ? 1: 
_php_mblen(bptr, limit - bptr)): 0);
                                switch (inc_len) {
                                        case 0:
                                                switch (state) {
@@ -2019,7 +2025,7 @@
                                                break;
                                }
                                bptr += inc_len;
-                               inc_len = (bptr < limit ? _php_mblen(bptr, limit - 
bptr): 0);
+                               inc_len = (bptr < limit ? (*bptr == '\0' ? 1: 
_php_mblen(bptr, limit - bptr)): 0);
                        }
                quit_loop_3:
                        comp_end = tptr;
@@ -2033,7 +2039,7 @@
                        hunk_begin = bptr;
 
                        for (;;) {
-                               inc_len = (bptr < limit ? _php_mblen(bptr, limit - 
bptr): 0);
+                               inc_len = (bptr < limit ? (*bptr == '\0' ? 1: 
_php_mblen(bptr, limit - bptr)): 0);
                                switch (inc_len) {
                                        case 0:
                                                goto quit_loop_4;

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

Reply via email to