iliaa Fri Nov 7 16:40:48 2003 EDT Added files: (Branch: PHP_4_3) /php-src/ext/standard/tests/file test3.csv bug26003.phpt
Modified files: /php-src NEWS /php-src/ext/standard file.c Log: Fixed bug #26003 (Make fgetcsv() binary safe). (Ilia) Index: php-src/NEWS diff -u php-src/NEWS:1.1247.2.460 php-src/NEWS:1.1247.2.461 --- php-src/NEWS:1.1247.2.460 Thu Nov 6 15:34:57 2003 +++ php-src/NEWS Fri Nov 7 16:40:45 2003 @@ -17,6 +17,7 @@ after every mcrypt_generic_init() call). (Ilia) - Fixed bug #26025 (Segfault on glob() without GLOB_NOCHECK or GLOB_NOMAGIC under *BSD platforms). (Moriyoshi) +- Fixed bug #26003 (Make fgetcsv() binary safe). (Ilia) - Fixed bug #25581 (getimagesize () return incorrect values on bitmap (os2) files). (Marcus) Index: php-src/ext/standard/file.c diff -u php-src/ext/standard/file.c:1.279.2.38 php-src/ext/standard/file.c:1.279.2.39 --- php-src/ext/standard/file.c:1.279.2.38 Thu Oct 9 21:38:01 2003 +++ php-src/ext/standard/file.c Fri Nov 7 16:40:46 2003 @@ -21,7 +21,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: file.c,v 1.279.2.38 2003/10/10 01:38:01 iliaa Exp $ */ +/* $Id: file.c,v 1.279.2.39 2003/11/07 21:40:46 iliaa Exp $ */ /* Synced with php 3.0 revision 1.218 1999-06-16 [ssb] */ @@ -2161,7 +2161,7 @@ /* first section exactly as php_fgetss */ zval **fd, **bytes, **p_delim, **p_enclosure; - int len, temp_len; + int len, temp_len, buf_len; char *buf; php_stream *stream; @@ -2225,7 +2225,7 @@ /* needed because recv/read/gzread doesnt set null char at end */ memset(buf, 0, len + 1); - if (php_stream_gets(stream, buf, len) == NULL) { + if (php_stream_get_line(stream, buf, len, &buf_len) == NULL) { efree(buf); RETURN_FALSE; } @@ -2236,7 +2236,7 @@ lineEnd = emalloc(len + 1); bptr = buf; - tptr = buf + strlen(buf) -1; + tptr = buf + buf_len -1; while ( isspace((int)*(unsigned char *)tptr) && (*tptr!=delimiter) && (tptr > bptr) ) tptr--; tptr++; strcpy(lineEnd, tptr); @@ -2299,17 +2299,25 @@ *tptr++ = *bptr++; if (*bptr == 0) { /* embedded line end? */ + if ((bptr - buf) < buf_len) { + while (*bptr == '\0') { + *tptr++ = *bptr++; + } + continue; + } + *(tptr-1)=0; /* remove space character added on reading line */ strcat(temp, lineEnd); /* add the embedded line end to the field */ /* read a new line from input, as at start of routine */ memset(buf, 0, len+1); - if (php_stream_gets(stream, buf, len) == NULL) { + if (php_stream_get_line(stream, buf, len, &buf_len) == NULL) { /* we've got an unterminated enclosure, assign all the data * from the start of the enclosure to end of data to the last element */ if (temp_len > len) { + *tptr = 0; break; } @@ -2323,7 +2331,7 @@ temp_len += len; temp = erealloc(temp, temp_len+1); bptr = buf; - tptr = buf + strlen(buf) -1; + tptr = buf + buf_len -1; while (isspace((int)*(unsigned char *)tptr) && (*tptr!=delimiter) && (tptr > bptr)) tptr--; tptr++; @@ -2339,14 +2347,17 @@ } } else { /* 2B. Handle non-enclosure field */ - while ((*bptr != delimiter) && *bptr) + while ((*bptr != delimiter) && ((bptr - buf) < buf_len)) *tptr++ = *bptr++; *tptr=0; /* terminate temporary string */ - if (strlen(temp)) { + if ((tptr - temp)) { tptr--; while (isspace((int)*(unsigned char *)tptr) && (*tptr!=delimiter)) *tptr-- = 0; /* strip any trailing spaces */ + if (*tptr) { + tptr++; + } } if (*bptr == delimiter) @@ -2354,7 +2365,11 @@ } /* 3. Now pass our field back to php */ - add_next_index_string(return_value, temp, 1); + if (*tptr == '\0') { + add_next_index_stringl(return_value, temp, (tptr - temp), 1); + } else { + add_next_index_string(return_value, temp, 1); + } tptr = temp; } while (*bptr); Index: php-src/ext/standard/tests/file/test3.csv +++ php-src/ext/standard/tests/file/test3.csv abc,de Index: php-src/ext/standard/tests/file/bug26003.phpt +++ php-src/ext/standard/tests/file/bug26003.phpt --TEST-- Bug #26003 (fgetcsv() is not binary-safe) --FILE-- <?php $fp = fopen(dirname(__FILE__).'/test3.csv', 'r'); var_dump(fgetcsv($fp, 4096)); ?> --EXPECT-- array(2) { [0]=> string(3) "abc" [1]=> string(3) "de" } -- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php