Skip to content

Commit 5ca356a

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

File tree

6 files changed

+64
-15
lines changed

6 files changed

+64
-15
lines changed

ext/spl/spl_directory.c

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

18851885
if (!buf) {
1886-
intern->u.file.current_line = estrdup("");
1887-
intern->u.file.current_line_len = 0;
1888-
} else {
1889-
if (SPL_HAS_FLAG(intern->flags, SPL_FILE_OBJECT_DROP_NEW_LINE)) {
1890-
if (line_len > 0 && buf[line_len - 1] == '\n') {
1886+
return FAILURE;
1887+
}
1888+
1889+
if (SPL_HAS_FLAG(intern->flags, SPL_FILE_OBJECT_DROP_NEW_LINE)) {
1890+
if (line_len > 0 && buf[line_len - 1] == '\n') {
1891+
line_len--;
1892+
if (line_len > 0 && buf[line_len - 1] == '\r') {
18911893
line_len--;
1892-
if (line_len > 0 && buf[line_len - 1] == '\r') {
1893-
line_len--;
1894-
}
1895-
buf[line_len] = '\0';
18961894
}
1895+
buf[line_len] = '\0';
18971896
}
1898-
1899-
intern->u.file.current_line = buf;
1900-
intern->u.file.current_line_len = line_len;
19011897
}
1898+
1899+
intern->u.file.current_line = buf;
1900+
intern->u.file.current_line_len = line_len;
19021901
intern->u.file.current_line_num += line_add;
19031902

19041903
return SUCCESS;

ext/spl/tests/SplFileObject_fgetcsv_basic.phpt renamed to ext/spl/tests/SplFileObject/SplFileObject_fgetcsv_basic.phpt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ fclose($fp);
1313

1414
$fo = new SplFileObject('SplFileObject__fgetcsv1.csv');
1515
var_dump($fo->fgetcsv());
16+
var_dump($fo->fgetcsv());
1617
?>
1718
--CLEAN--
1819
<?php
@@ -29,3 +30,4 @@ array(4) {
2930
[3]=>
3031
string(1) "5"
3132
}
33+
bool(false)

ext/spl/tests/SplFileObject_key_error001.phpt renamed to 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_key_error002.phpt renamed to 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)
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

ext/spl/tests/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"

0 commit comments

Comments
 (0)