|
|
| version 1.1.1.2, 2012/05/29 12:34:35 | version 1.1.1.4, 2013/10/14 08:02:43 |
|---|---|
| Line 2 | Line 2 |
| +----------------------------------------------------------------------+ | +----------------------------------------------------------------------+ |
| | PHP Version 5 | | | PHP Version 5 | |
| +----------------------------------------------------------------------+ | +----------------------------------------------------------------------+ |
| | Copyright (c) 1997-2012 The PHP Group | | | Copyright (c) 1997-2013 The PHP Group | |
| +----------------------------------------------------------------------+ | +----------------------------------------------------------------------+ |
| | This source file is subject to version 3.01 of the PHP license, | | | This source file is subject to version 3.01 of the PHP license, | |
| | that is bundled with this package in the file LICENSE, and is | | | that is bundled with this package in the file LICENSE, and is | |
| Line 1028 PHPAPI char *php_stream_get_record(php_stream *stream, | Line 1028 PHPAPI char *php_stream_get_record(php_stream *stream, |
| char *ret_buf, /* returned buffer */ | char *ret_buf, /* returned buffer */ |
| *found_delim = NULL; | *found_delim = NULL; |
| size_t buffered_len, | size_t buffered_len, |
| tent_ret_len; /* tentative returned length*/ | tent_ret_len; /* tentative returned length */ |
| int has_delim = delim_len > 0 && delim[0] != '\0'; | int has_delim = delim_len > 0; |
| if (maxlen == 0) { | if (maxlen == 0) { |
| return NULL; | return NULL; |
| Line 1060 PHPAPI char *php_stream_get_record(php_stream *stream, | Line 1060 PHPAPI char *php_stream_get_record(php_stream *stream, |
| if (has_delim) { | if (has_delim) { |
| /* search for delimiter, but skip buffered_len (the number of bytes | /* search for delimiter, but skip buffered_len (the number of bytes |
| * buffered before this loop iteration), as they have already been | * buffered before this loop iteration), as they have already been |
| * searched for the delimiter */ | * searched for the delimiter. |
| * The left part of the delimiter may still remain in the buffer, | |
| * so subtract up to <delim_len - 1> from buffered_len, which is | |
| * the ammount of data we skip on this search as an optimization | |
| */ | |
| found_delim = _php_stream_search_delim( | found_delim = _php_stream_search_delim( |
| stream, maxlen, buffered_len, delim, delim_len TSRMLS_CC); | stream, maxlen, |
| buffered_len >= (delim_len - 1) | |
| ? buffered_len - (delim_len - 1) | |
| : 0, | |
| delim, delim_len TSRMLS_CC); | |
| if (found_delim) { | if (found_delim) { |
| break; | break; |
| } | } |
| Line 1437 PHPAPI size_t _php_stream_copy_to_mem(php_stream *src, | Line 1445 PHPAPI size_t _php_stream_copy_to_mem(php_stream *src, |
| len += ret; | len += ret; |
| ptr += ret; | ptr += ret; |
| } | } |
| *ptr = '\0'; | if (len) { |
| *ptr = '\0'; | |
| } else { | |
| pefree(*buf, persistent); | |
| *buf = NULL; | |
| } | |
| return len; | return len; |
| } | } |
| Line 1481 PHPAPI int _php_stream_copy_to_stream_ex(php_stream *s | Line 1494 PHPAPI int _php_stream_copy_to_stream_ex(php_stream *s |
| char buf[CHUNK_SIZE]; | char buf[CHUNK_SIZE]; |
| size_t readchunk; | size_t readchunk; |
| size_t haveread = 0; | size_t haveread = 0; |
| size_t didread; | size_t didread, didwrite, towrite; |
| size_t dummy; | size_t dummy; |
| php_stream_statbuf ssbuf; | php_stream_statbuf ssbuf; |
| Line 1516 PHPAPI int _php_stream_copy_to_stream_ex(php_stream *s | Line 1529 PHPAPI int _php_stream_copy_to_stream_ex(php_stream *s |
| p = php_stream_mmap_range(src, php_stream_tell(src), maxlen, PHP_STREAM_MAP_MODE_SHARED_READONLY, &mapped); | p = php_stream_mmap_range(src, php_stream_tell(src), maxlen, PHP_STREAM_MAP_MODE_SHARED_READONLY, &mapped); |
| if (p) { | if (p) { |
| mapped = php_stream_write(dest, p, mapped); | didwrite = php_stream_write(dest, p, mapped); |
| php_stream_mmap_unmap_ex(src, mapped); | php_stream_mmap_unmap_ex(src, mapped); |
| *len = mapped; | *len = didwrite; |
| /* we've got at least 1 byte to read. | /* we've got at least 1 byte to read |
| * less than 1 is an error */ | * less than 1 is an error |
| * AND read bytes match written */ | |
| if (mapped > 0) { | if (mapped > 0 && mapped == didwrite) { |
| return SUCCESS; | return SUCCESS; |
| } | } |
| return FAILURE; | return FAILURE; |
| Line 1543 PHPAPI int _php_stream_copy_to_stream_ex(php_stream *s | Line 1556 PHPAPI int _php_stream_copy_to_stream_ex(php_stream *s |
| if (didread) { | if (didread) { |
| /* extra paranoid */ | /* extra paranoid */ |
| size_t didwrite, towrite; | |
| char *writeptr; | char *writeptr; |
| towrite = didread; | towrite = didread; |
| Line 2327 PHPAPI int _php_stream_scandir(char *dirname, char **n | Line 2339 PHPAPI int _php_stream_scandir(char *dirname, char **n |
| php_stream *stream; | php_stream *stream; |
| php_stream_dirent sdp; | php_stream_dirent sdp; |
| char **vector = NULL; | char **vector = NULL; |
| int vector_size = 0; | unsigned int vector_size = 0; |
| int nfiles = 0; | unsigned int nfiles = 0; |
| if (!namelist) { | if (!namelist) { |
| return FAILURE; | return FAILURE; |
| Line 2344 PHPAPI int _php_stream_scandir(char *dirname, char **n | Line 2356 PHPAPI int _php_stream_scandir(char *dirname, char **n |
| if (vector_size == 0) { | if (vector_size == 0) { |
| vector_size = 10; | vector_size = 10; |
| } else { | } else { |
| if(vector_size*2 < vector_size) { | |
| /* overflow */ | |
| php_stream_closedir(stream); | |
| efree(vector); | |
| return FAILURE; | |
| } | |
| vector_size *= 2; | vector_size *= 2; |
| } | } |
| vector = (char **) erealloc(vector, vector_size * sizeof(char *)); | vector = (char **) safe_erealloc(vector, vector_size, sizeof(char *), 0); |
| } | } |
| vector[nfiles] = estrdup(sdp.d_name); | vector[nfiles] = estrdup(sdp.d_name); |
| nfiles++; | nfiles++; |
| if(vector_size < 10 || nfiles == 0) { | |
| /* overflow */ | |
| php_stream_closedir(stream); | |
| efree(vector); | |
| return FAILURE; | |
| } | |
| } | } |
| php_stream_closedir(stream); | php_stream_closedir(stream); |
| *namelist = vector; | *namelist = vector; |
| if (compare) { | if (nfiles > 0 && compare) { |
| qsort(*namelist, nfiles, sizeof(char *), (int(*)(const void *, const void *))compare); | qsort(*namelist, nfiles, sizeof(char *), (int(*)(const void *, const void *))compare); |
| } | } |
| return nfiles; | return nfiles; |