Skip to content

Commit 3a71fcf

Browse files
committed
Merge branch 'PHP-8.0' into PHP-8.1
* PHP-8.0: Fix GH-8121: SplFileObject - seek and key with csv file inconsistent
2 parents 67b372e + 1d9a1f9 commit 3a71fcf

File tree

4 files changed

+54
-7
lines changed

4 files changed

+54
-7
lines changed

NEWS

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@ PHP NEWS
1616
- Pcntl:
1717
. Fixed bug GH-8142 (Compilation error on cygwin). (David Carlier)
1818

19+
- SPL:
20+
. Fixed bug GH-8121 (SplFileObject - seek and key with csv file inconsistent).
21+
(cmb)
22+
1923
- Standard:
2024
. Fixed bug GH-8048 (Force macOS to use statfs). (risner)
2125

ext/spl/spl_directory.c

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1943,7 +1943,11 @@ static int spl_filesystem_file_read_line_ex(zval * this_ptr, spl_filesystem_obje
19431943
zval retval;
19441944

19451945
/* 1) use fgetcsv? 2) overloaded call the function, 3) do it directly */
1946-
if (SPL_HAS_FLAG(intern->flags, SPL_FILE_OBJECT_READ_CSV) || intern->u.file.func_getCurr->common.scope != spl_ce_SplFileObject) {
1946+
if (SPL_HAS_FLAG(intern->flags, SPL_FILE_OBJECT_READ_CSV)) {
1947+
return spl_filesystem_file_read_csv(intern, intern->u.file.delimiter, intern->u.file.enclosure, intern->u.file.escape, NULL);
1948+
}
1949+
if (intern->u.file.func_getCurr->common.scope != spl_ce_SplFileObject) {
1950+
zend_execute_data *execute_data = EG(current_execute_data);
19471951
spl_filesystem_file_free_line(intern);
19481952

19491953
if (php_stream_eof(intern->u.file.stream)) {
@@ -1952,11 +1956,6 @@ static int spl_filesystem_file_read_line_ex(zval * this_ptr, spl_filesystem_obje
19521956
}
19531957
return FAILURE;
19541958
}
1955-
if (SPL_HAS_FLAG(intern->flags, SPL_FILE_OBJECT_READ_CSV)) {
1956-
return spl_filesystem_file_read_csv(intern, intern->u.file.delimiter, intern->u.file.enclosure, intern->u.file.escape, NULL);
1957-
}
1958-
1959-
zend_execute_data *execute_data = EG(current_execute_data);
19601959
zend_call_method_with_0_params(Z_OBJ_P(this_ptr), Z_OBJCE_P(ZEND_THIS), &intern->u.file.func_getCurr, "getCurrentLine", &retval);
19611960
if (Z_ISUNDEF(retval)) {
19621961
return FAILURE;
@@ -2733,8 +2732,8 @@ PHP_METHOD(SplFileObject, seek)
27332732
}
27342733
}
27352734
if (line_pos > 0) {
2736-
intern->u.file.current_line_num++;
27372735
if (!SPL_HAS_FLAG(intern->flags, SPL_FILE_OBJECT_READ_AHEAD)) {
2736+
intern->u.file.current_line_num++;
27382737
spl_filesystem_file_free_line(intern);
27392738
}
27402739
}

ext/spl/tests/gh8121.csv

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
id,status,on_sale,brand,name,link,meta_title,meta_desc,description
2+
1,2,15,Samsung,M21,samsung-m21,Samsung M21,Samsung M21,Samsung M21
3+
2,2,15,Samsung,M32,samsung-m32,Samsung M32,Samsung M32,Samsung M32
4+
3,2,15,Samsung,M21,samsung-m21,Samsung M21,Samsung M21,Samsung M21
5+
4,2,15,Samsung,M32,samsung-m32,Samsung M32,Samsung M32,Samsung M32

ext/spl/tests/gh8121.phpt

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
--TEST--
2+
GH-8121 (SplFileObject - seek and key with csv file inconsistent)
3+
--FILE--
4+
<?php
5+
$flagss = [
6+
SplFileObject::READ_AHEAD | SplFileObject::READ_CSV | SplFileObject::SKIP_EMPTY | SplFileObject::DROP_NEW_LINE,
7+
SplFileObject::READ_AHEAD | SplFileObject::SKIP_EMPTY | SplFileObject::DROP_NEW_LINE,
8+
SplFileObject::SKIP_EMPTY | SplFileObject::DROP_NEW_LINE,
9+
];
10+
foreach ($flagss as $flags) {
11+
$file = new SplFileObject(__DIR__ . "/gh8121.csv", "r");
12+
echo "flags: $flags\n";
13+
$file->setFlags($flags);
14+
$file->seek(0);
15+
var_dump($file->key());
16+
$file->seek(1);
17+
var_dump($file->key());
18+
$file->seek(2);
19+
var_dump($file->key());
20+
$file->seek(3);
21+
var_dump($file->key());
22+
}
23+
?>
24+
--EXPECT--
25+
flags: 15
26+
int(0)
27+
int(1)
28+
int(2)
29+
int(3)
30+
flags: 7
31+
int(0)
32+
int(1)
33+
int(2)
34+
int(3)
35+
flags: 5
36+
int(0)
37+
int(1)
38+
int(2)
39+
int(3)

0 commit comments

Comments
 (0)