]> granicus.if.org Git - php/commitdiff
Fixed bug #27633 (Incorrect EOL translation by ftp_get() in ASCII mode).
authorIlia Alshanetsky <iliaa@php.net>
Thu, 18 Mar 2004 17:12:07 +0000 (17:12 +0000)
committerIlia Alshanetsky <iliaa@php.net>
Thu, 18 Mar 2004 17:12:07 +0000 (17:12 +0000)
ext/ftp/ftp.c

index fd3cd461ec886c941c36654465fcc5622c36c424..69a164c8b19371b5a175c1774c8ed697fdf1e6c0 100644 (file)
@@ -790,7 +790,6 @@ int
 ftp_get(ftpbuf_t *ftp, php_stream *outstream, const char *path, ftptype_t type, int resumepos TSRMLS_DC)
 {
        databuf_t               *data = NULL;
-       char                    *ptr;
        int                     lastch;
        size_t                  rcvd;
        char                    arg[11];
@@ -840,22 +839,45 @@ ftp_get(ftpbuf_t *ftp, php_stream *outstream, const char *path, ftptype_t type,
                }
 
                if (type == FTPTYPE_ASCII) {
-                       for (ptr = data->buf; rcvd; rcvd--, ptr++) {
-                               if (lastch == '\r' && *ptr != '\n')
+                       char *s;
+                       char *ptr = data->buf;
+                       char *e = ptr + rcvd;
+                       /* logic depends on the OS EOL
+                        * Win32 -> \r\n
+                        * Everything Else \n
+                        */
+#ifdef PHP_WIN32
+                       while ((s = strpbrk(ptr, "\r\n"))) {
+                               if (*s == '\n') {
                                        php_stream_putc(outstream, '\r');
-                               if (*ptr != '\r')
-                                       php_stream_putc(outstream, *ptr);
-                               lastch = *ptr;
+                               } else if (*s == '\r' && *(s + 1) == '\n') {
+                                       s++;
+                               }
+                               s++;
+                               php_stream_write(outstream, ptr, (s - ptr));
+                               if (*(s - 1) == '\r') {
+                                       php_stream_putc(outstream, '\n');
+                               }
+                               ptr = s;
+                       }
+#else
+                       while ((s = memchr(ptr, '\r', (e - ptr)))) {
+                               php_stream_write(outstream, ptr, (s - ptr));
+                               if (*(s + 1) == '\n') {
+                                       s++;
+                               }
+                               php_stream_putc(outstream, '\n');
+                               ptr = s + 1;
+                       }
+#endif
+                       if (ptr < e) {
+                               php_stream_write(outstream, ptr, (e - ptr));
                        }
                } else if (rcvd != php_stream_write(outstream, data->buf, rcvd)) {
                        goto bail;
                }
        }
 
-       if (type == FTPTYPE_ASCII && lastch == '\r') {
-               php_stream_putc(outstream, '\r');
-       }
-
        ftp->data = data = data_close(ftp, data);
 
        if (!ftp_getresp(ftp) || (ftp->resp != 226 && ftp->resp != 250)) {