]> granicus.if.org Git - php/commitdiff
Fixed bug #48607 (fwrite() doesn't check reply from ftp server before exiting)
authorIlia Alshanetsky <iliaa@php.net>
Mon, 13 Dec 2010 16:53:26 +0000 (16:53 +0000)
committerIlia Alshanetsky <iliaa@php.net>
Mon, 13 Dec 2010 16:53:26 +0000 (16:53 +0000)
NEWS
ext/standard/ftp_fopen_wrapper.c

diff --git a/NEWS b/NEWS
index 868a00b35c5515f7ae0c11956091eeeaf540da1b..2db51c2a218077654a020a547fca9908dfff1189 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -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).
index 6b418157df9e6ce62239add8871a7c8479da0e86..d15171e0d2916c21533f5303f7860abf75a5cd5f 100644 (file)
@@ -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;
 }
 /* }}} */