diff options
author | Ilia Alshanetsky <iliaa@php.net> | 2010-12-13 16:53:26 +0000 |
---|---|---|
committer | Ilia Alshanetsky <iliaa@php.net> | 2010-12-13 16:53:26 +0000 |
commit | 8afdb7cd49e59d016f45a2ca6ce268a8d5ee3113 (patch) | |
tree | fd860450dc661769a69eb3a3df27112a6538f451 | |
parent | 5a6288297d860e3ed9fd783e4712627f0d591323 (diff) | |
download | php-git-8afdb7cd49e59d016f45a2ca6ce268a8d5ee3113.tar.gz |
Fixed bug #48607 (fwrite() doesn't check reply from ftp server before exiting)
-rw-r--r-- | NEWS | 2 | ||||
-rw-r--r-- | ext/standard/ftp_fopen_wrapper.c | 24 |
2 files changed, 24 insertions, 2 deletions
@@ -10,6 +10,8 @@ - Core: . Fixed bug #48484 (array_product() always returns 0 for an empty array). (Ilia) + . Fixed bug #48607 (fwrite() doesn't check reply from ftp server before + exiting). (Ilia) - Filter extension: . Fixed bug #53150 (FILTER_FLAG_NO_RES_RANGE is missing some IP ranges). diff --git a/ext/standard/ftp_fopen_wrapper.c b/ext/standard/ftp_fopen_wrapper.c index 6b418157df..d15171e0d2 100644 --- a/ext/standard/ftp_fopen_wrapper.c +++ b/ext/standard/ftp_fopen_wrapper.c @@ -98,13 +98,33 @@ static int php_stream_ftp_stream_stat(php_stream_wrapper *wrapper, php_stream *s static int php_stream_ftp_stream_close(php_stream_wrapper *wrapper, php_stream *stream TSRMLS_DC) { php_stream *controlstream = (php_stream *)stream->wrapperdata; + int ret = 0; if (controlstream) { + if (strpbrk(stream->mode, "wa+")) { + char tmp_line[512]; + int result; + + /* For write modes close data stream first to signal EOF to server */ + stream->wrapperdata = NULL; + php_stream_close(stream); + stream = NULL; + + result = GET_FTP_RESULT(controlstream); + if (result != 226 && result != 250) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "FTP server error %d:%s", result, tmp_line); + ret = EOF; + } + } + php_stream_write_string(controlstream, "QUIT\r\n"); php_stream_close(controlstream); - stream->wrapperdata = NULL; + if (stream) { + stream->wrapperdata = NULL; + } } - return 0; + + return ret; } /* }}} */ |