diff options
| author | Moriyoshi Koizumi <moriyoshi@php.net> | 2003-02-18 23:30:36 +0000 |
|---|---|---|
| committer | Moriyoshi Koizumi <moriyoshi@php.net> | 2003-02-18 23:30:36 +0000 |
| commit | 6389a79ea5df4a488855af777b1076695fb8b5ba (patch) | |
| tree | 9d9a92d99496dd7f472ff3987bf1e9eafc6f3db2 | |
| parent | 8793a78fee9069bf5f5244dcb4a0fa7d5213ca74 (diff) | |
| download | php-git-6389a79ea5df4a488855af777b1076695fb8b5ba.tar.gz | |
Fixed memory leaks on conversion failure.
| -rw-r--r-- | ext/standard/filters.c | 25 |
1 files changed, 17 insertions, 8 deletions
diff --git a/ext/standard/filters.c b/ext/standard/filters.c index 536ce0d9e4..cea59c20b6 100644 --- a/ext/standard/filters.c +++ b/ext/standard/filters.c @@ -1342,11 +1342,11 @@ static php_stream_filter_status_t strfilter_convert_filter( int flags TSRMLS_DC) { - php_stream_bucket *bucket, *new_bucket; + php_stream_bucket *bucket = NULL, *new_bucket; size_t consumed = 0; php_conv_err_t err; php_convert_filter *inst = (php_convert_filter *)thisfilter->abstract; - char *out_buf; + char *out_buf = NULL; size_t out_buf_size; char *pd; size_t ocnt; @@ -1368,15 +1368,15 @@ static php_stream_filter_status_t strfilter_convert_filter( switch (err) { case PHP_CONV_ERR_UNKNOWN: php_error_docref(NULL TSRMLS_CC, E_WARNING, "stream filter (%s): unknown error", inst->filtername, err); - return PSFS_ERR_FATAL; + goto out_failure; case PHP_CONV_ERR_INVALID_SEQ: php_error_docref(NULL TSRMLS_CC, E_WARNING, "stream filter (%s): invalid base64 sequence", inst->filtername, err); - return PSFS_ERR_FATAL; + goto out_failure; case PHP_CONV_ERR_UNEXPECTED_EOS: php_error_docref(NULL TSRMLS_CC, E_WARNING, "stream filter (%s): unexpected end of stream", inst->filtername, err); - return PSFS_ERR_FATAL; + goto out_failure; default: break; @@ -1439,15 +1439,15 @@ static php_stream_filter_status_t strfilter_convert_filter( switch (err) { case PHP_CONV_ERR_UNKNOWN: php_error_docref(NULL TSRMLS_CC, E_WARNING, "stream filter (%s): unknown error", inst->filtername, err); - return PSFS_ERR_FATAL; + goto out_failure; case PHP_CONV_ERR_INVALID_SEQ: php_error_docref(NULL TSRMLS_CC, E_WARNING, "stream filter (%s): invalid base64 sequence", inst->filtername, err); - return PSFS_ERR_FATAL; + goto out_failure; case PHP_CONV_ERR_UNEXPECTED_EOS: php_error_docref(NULL TSRMLS_CC, E_WARNING, "stream filter (%s): unexpected end of stream", inst->filtername, err); - return PSFS_ERR_FATAL; + goto out_failure; default: break; @@ -1497,6 +1497,15 @@ static php_stream_filter_status_t strfilter_convert_filter( } return PSFS_PASS_ON; + +out_failure: + if (out_buf != NULL) { + pefree(out_buf, inst->persistent); + } + if (bucket != NULL) { + php_stream_bucket_delref(bucket TSRMLS_CC); + } + return PSFS_ERR_FATAL; } static void strfilter_convert_dtor(php_stream_filter *thisfilter TSRMLS_DC) |
