Skip to content

Commit b3eb7e8

Browse files
committed
Fix GH-8563
With memory streams if we get a NULL buffer we must not instantiate an empty line
1 parent db7ff5a commit b3eb7e8

File tree

6 files changed

+62
-20
lines changed

6 files changed

+62
-20
lines changed

ext/spl/spl_directory.c

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1892,22 +1892,21 @@ static zend_result spl_filesystem_file_read_ex(spl_filesystem_object *intern, bo
18921892
}
18931893

18941894
if (!buf) {
1895-
intern->u.file.current_line = estrdup("");
1896-
intern->u.file.current_line_len = 0;
1897-
} else {
1898-
if (SPL_HAS_FLAG(intern->flags, SPL_FILE_OBJECT_DROP_NEW_LINE)) {
1899-
if (line_len > 0 && buf[line_len - 1] == '\n') {
1895+
return FAILURE;
1896+
}
1897+
1898+
if (SPL_HAS_FLAG(intern->flags, SPL_FILE_OBJECT_DROP_NEW_LINE)) {
1899+
if (line_len > 0 && buf[line_len - 1] == '\n') {
1900+
line_len--;
1901+
if (line_len > 0 && buf[line_len - 1] == '\r') {
19001902
line_len--;
1901-
if (line_len > 0 && buf[line_len - 1] == '\r') {
1902-
line_len--;
1903-
}
1904-
buf[line_len] = '\0';
19051903
}
1904+
buf[line_len] = '\0';
19061905
}
1907-
1908-
intern->u.file.current_line = buf;
1909-
intern->u.file.current_line_len = line_len;
19101906
}
1907+
1908+
intern->u.file.current_line = buf;
1909+
intern->u.file.current_line_len = line_len;
19111910
intern->u.file.current_line_num += line_add;
19121911

19131912
return SUCCESS;

ext/spl/tests/SplFileObject/SplFileObject_fgetcsv_basic.phpt

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ fclose($fp);
1414
$fo = new SplFileObject('SplFileObject__fgetcsv1.csv');
1515
var_dump($fo->fgetcsv());
1616
var_dump($fo->fgetcsv());
17-
var_dump($fo->fgetcsv());
1817
?>
1918
--CLEAN--
2019
<?php
@@ -31,8 +30,4 @@ array(4) {
3130
[3]=>
3231
string(1) "5"
3332
}
34-
array(1) {
35-
[0]=>
36-
NULL
37-
}
3833
bool(false)

ext/spl/tests/SplFileObject/SplFileObject_key_error001.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,5 @@ var_dump($s->key());
1818
var_dump($s->valid());
1919
?>
2020
--EXPECT--
21-
int(14)
21+
int(12)
2222
bool(false)

ext/spl/tests/SplFileObject/SplFileObject_key_error002.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,5 @@ var_dump($s->key());
1818
var_dump($s->valid());
1919
?>
2020
--EXPECT--
21-
int(13)
21+
int(12)
2222
bool(false)

ext/spl/tests/SplFileObject/fileobject_001.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ string(1) "4"
7070
int(5)
7171
string(1) "5"
7272
int(6)
73-
string(0) ""
73+
bool(false)
7474
===B===
7575
int(0)
7676
string(1) "0"
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
--TEST--
2+
Bug GH-8563: Different results for seek() on SplFileObject and SplTempFileObject
3+
--FILE--
4+
<?php
5+
6+
const LINES = 5;
7+
const INDEX = 10;
8+
9+
$file_01 = new SplFileObject(__DIR__ . '/gh8563.txt', 'w+');
10+
$file_02 = new SplTempFileObject(-1);
11+
$file_03 = new SplTempFileObject(0);
12+
$file_04 = new SplTempFileObject();
13+
14+
// write to files
15+
for ($i = 0; $i < LINES; $i++) {
16+
$file_01->fwrite("line {$i}" . PHP_EOL);
17+
$file_02->fwrite("line {$i}" . PHP_EOL);
18+
$file_03->fwrite("line {$i}" . PHP_EOL);
19+
$file_04->fwrite("line {$i}" . PHP_EOL);
20+
}
21+
22+
// reset
23+
$file_01->rewind();
24+
$file_02->rewind();
25+
$file_03->rewind();
26+
$file_04->rewind();
27+
28+
// seek
29+
$file_01->seek(INDEX);
30+
$file_02->seek(INDEX);
31+
$file_03->seek(INDEX);
32+
$file_04->seek(INDEX);
33+
34+
// show results
35+
echo 'file_01: ' . $file_01->key(), PHP_EOL;
36+
echo 'file_02: ' . $file_02->key(), PHP_EOL;
37+
echo 'file_03: ' . $file_03->key(), PHP_EOL;
38+
echo 'file_04: ' . $file_04->key(), PHP_EOL;
39+
?>
40+
--CLEAN--
41+
<?php
42+
unlink(__DIR__ . '/gh8563.txt');
43+
?>
44+
--EXPECT--
45+
file_01: 4
46+
file_02: 4
47+
file_03: 4
48+
file_04: 4

0 commit comments

Comments
 (0)