diff options
Diffstat (limited to 'ext/standard/file.c')
-rw-r--r-- | ext/standard/file.c | 37 |
1 files changed, 21 insertions, 16 deletions
diff --git a/ext/standard/file.c b/ext/standard/file.c index a651c8744c..d0f574f224 100644 --- a/ext/standard/file.c +++ b/ext/standard/file.c @@ -586,7 +586,7 @@ PHP_FUNCTION(file_put_contents) char *filename; size_t filename_len; zval *data; - size_t numbytes = 0; + ssize_t numbytes = 0; zend_long flags = 0; zval *zcontext = NULL; php_stream_context *context = NULL; @@ -669,7 +669,7 @@ PHP_FUNCTION(file_put_contents) case IS_ARRAY: if (zend_hash_num_elements(Z_ARRVAL_P(data))) { - size_t bytes_written; + ssize_t bytes_written; zval *tmp; ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(data), tmp) { @@ -710,7 +710,7 @@ PHP_FUNCTION(file_put_contents) } php_stream_close(stream); - if (numbytes == (size_t)-1) { + if (numbytes < 0) { RETURN_FALSE; } @@ -1184,14 +1184,14 @@ PHP_FUNCTION(fscanf) } /* }}} */ -/* {{{ proto int fwrite(resource fp, string str [, int length]) +/* {{{ proto int|false fwrite(resource fp, string str [, int length]) Binary-safe file write */ PHPAPI PHP_FUNCTION(fwrite) { zval *res; char *input; size_t inputlen; - size_t ret; + ssize_t ret; size_t num_bytes; zend_long maxlen = 0; php_stream *stream; @@ -1218,6 +1218,9 @@ PHPAPI PHP_FUNCTION(fwrite) PHP_STREAM_TO_ZVAL(stream, res); ret = php_stream_write(stream, input, num_bytes); + if (ret < 0) { + RETURN_FALSE; + } RETURN_LONG(ret); } @@ -1783,13 +1786,14 @@ safe_to_copy: } /* }}} */ -/* {{{ proto string fread(resource fp, int length) +/* {{{ proto string|false fread(resource fp, int length) Binary-safe file read */ PHPAPI PHP_FUNCTION(fread) { zval *res; zend_long len; php_stream *stream; + zend_string *str; ZEND_PARSE_PARAMETERS_START(2, 2) Z_PARAM_RESOURCE(res) @@ -1803,15 +1807,13 @@ PHPAPI PHP_FUNCTION(fread) RETURN_FALSE; } - ZVAL_NEW_STR(return_value, zend_string_alloc(len, 0)); - Z_STRLEN_P(return_value) = php_stream_read(stream, Z_STRVAL_P(return_value), len); - - /* needed because recv/read/gzread doesn't put a null at the end*/ - Z_STRVAL_P(return_value)[Z_STRLEN_P(return_value)] = 0; - - if (Z_STRLEN_P(return_value) < len / 2) { - Z_STR_P(return_value) = zend_string_truncate(Z_STR_P(return_value), Z_STRLEN_P(return_value), 0); + str = php_stream_read_to_str(stream, len); + if (!str) { + zval_ptr_dtor_str(return_value); + RETURN_FALSE; } + + RETURN_STR(str); } /* }}} */ @@ -1864,7 +1866,7 @@ PHP_FUNCTION(fputcsv) int escape_char = (unsigned char) '\\'; /* allow this to be set as parameter */ php_stream *stream; zval *fp = NULL, *fields = NULL; - size_t ret; + ssize_t ret; char *delimiter_str = NULL, *enclosure_str = NULL, *escape_str = NULL; size_t delimiter_str_len = 0, enclosure_str_len = 0, escape_str_len = 0; @@ -1916,12 +1918,15 @@ PHP_FUNCTION(fputcsv) PHP_STREAM_TO_ZVAL(stream, fp); ret = php_fputcsv(stream, fields, delimiter, enclosure, escape_char); + if (ret < 0) { + RETURN_FALSE; + } RETURN_LONG(ret); } /* }}} */ /* {{{ PHPAPI size_t php_fputcsv(php_stream *stream, zval *fields, char delimiter, char enclosure, int escape_char) */ -PHPAPI size_t php_fputcsv(php_stream *stream, zval *fields, char delimiter, char enclosure, int escape_char) +PHPAPI ssize_t php_fputcsv(php_stream *stream, zval *fields, char delimiter, char enclosure, int escape_char) { int count, i = 0; size_t ret; |