]> granicus.if.org Git - php/commitdiff
MFB5.3 fix for bug #44034 (FILE_IGNORE_NEW_LINES in file() does not work as
authorArnaud Le Blanc <lbarnaud@php.net>
Fri, 8 May 2009 09:49:27 +0000 (09:49 +0000)
committerArnaud Le Blanc <lbarnaud@php.net>
Fri, 8 May 2009 09:49:27 +0000 (09:49 +0000)
expected when lines end in \r\n) (fixes #48175)

ext/standard/file.c
ext/standard/tests/file/bug44034.phpt [new file with mode: 0644]

index df600f527e1c739751fd333fee389f00fccfd8bf..25887fd8a65e3d350cce91ea256a4f81993cde4d 100644 (file)
@@ -788,16 +788,20 @@ parse_eol:
                        } while ((p = memchr(p, eol_marker, (e-p))));
                } else {
                        do {
-                               if (skip_blank_lines && !(p-s)) {
+                               int windows_eol = 0;
+                               if (p != target_buf && eol_marker == '\n' && *(p - 1) == '\r') {
+                                       windows_eol++;
+                               }
+                               if (skip_blank_lines && !(p-s-windows_eol)) {
                                        s = ++p;
                                        continue;
                                }
                                if (PG(magic_quotes_runtime)) {
                                        /* s is in target_buf which is freed at the end of the function */
-                                       slashed = php_addslashes(s, (p-s), &len, 0 TSRMLS_CC);
+                                       slashed = php_addslashes(s, (p-s-windows_eol), &len, 0 TSRMLS_CC);
                                        add_index_stringl(return_value, i++, slashed, len, 0);
                                } else {
-                                       add_index_stringl(return_value, i++, estrndup(s, p-s), p-s, 0);
+                                       add_index_stringl(return_value, i++, estrndup(s, p-s-windows_eol), p-s-windows_eol, 0);
                                }
                                s = ++p;
                        } while ((p = memchr(p, eol_marker, (e-p))));
diff --git a/ext/standard/tests/file/bug44034.phpt b/ext/standard/tests/file/bug44034.phpt
new file mode 100644 (file)
index 0000000..0a8df3e
--- /dev/null
@@ -0,0 +1,39 @@
+--TEST--
+Bug #44034
+--FILE--
+<?php
+
+$urls = array();
+$urls[] = "data://text/plain,foo\r\nbar\r\n";
+$urls[] = "data://text/plain,\r\nfoo\r\nbar\r\n";
+$urls[] = "data://text/plain,foo\r\nbar";
+
+foreach($urls as $url) {
+       echo strtr($url, array("\r" => "\\r", "\n" => "\\n")) . "\n";
+       var_dump(file($url, FILE_IGNORE_NEW_LINES));
+}
+?>
+--EXPECTF--
+data://text/plain,foo\r\nbar\r\n
+array(2) {
+  [0]=>
+  string(3) "foo"
+  [1]=>
+  string(3) "bar"
+}
+data://text/plain,\r\nfoo\r\nbar\r\n
+array(3) {
+  [0]=>
+  string(0) ""
+  [1]=>
+  string(3) "foo"
+  [2]=>
+  string(3) "bar"
+}
+data://text/plain,foo\r\nbar
+array(2) {
+  [0]=>
+  string(3) "foo"
+  [1]=>
+  string(3) "bar"
+}