Skip to content

Commit 634b214

Browse files
committed
Merge branch 'PHP-8.1'
* PHP-8.1: Fix GH-8121: SplFileObject - seek and key with csv file inconsistent
2 parents 6a2c501 + 3a71fcf commit 634b214

File tree

3 files changed

+50
-7
lines changed

3 files changed

+50
-7
lines changed

ext/spl/spl_directory.c

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

19411941
/* 1) use fgetcsv? 2) overloaded call the function, 3) do it directly */
1942-
if (SPL_HAS_FLAG(intern->flags, SPL_FILE_OBJECT_READ_CSV) || intern->u.file.func_getCurr->common.scope != spl_ce_SplFileObject) {
1942+
if (SPL_HAS_FLAG(intern->flags, SPL_FILE_OBJECT_READ_CSV)) {
1943+
return spl_filesystem_file_read_csv(intern, intern->u.file.delimiter, intern->u.file.enclosure, intern->u.file.escape, NULL);
1944+
}
1945+
if (intern->u.file.func_getCurr->common.scope != spl_ce_SplFileObject) {
1946+
zend_execute_data *execute_data = EG(current_execute_data);
19431947
spl_filesystem_file_free_line(intern);
19441948

19451949
if (php_stream_eof(intern->u.file.stream)) {
@@ -1948,11 +1952,6 @@ static int spl_filesystem_file_read_line_ex(zval * this_ptr, spl_filesystem_obje
19481952
}
19491953
return FAILURE;
19501954
}
1951-
if (SPL_HAS_FLAG(intern->flags, SPL_FILE_OBJECT_READ_CSV)) {
1952-
return spl_filesystem_file_read_csv(intern, intern->u.file.delimiter, intern->u.file.enclosure, intern->u.file.escape, NULL);
1953-
}
1954-
1955-
zend_execute_data *execute_data = EG(current_execute_data);
19561955
zend_call_method_with_0_params(Z_OBJ_P(this_ptr), Z_OBJCE_P(ZEND_THIS), &intern->u.file.func_getCurr, "getCurrentLine", &retval);
19571956
if (Z_ISUNDEF(retval)) {
19581957
return FAILURE;
@@ -2736,8 +2735,8 @@ PHP_METHOD(SplFileObject, seek)
27362735
}
27372736
}
27382737
if (line_pos > 0) {
2739-
intern->u.file.current_line_num++;
27402738
if (!SPL_HAS_FLAG(intern->flags, SPL_FILE_OBJECT_READ_AHEAD)) {
2739+
intern->u.file.current_line_num++;
27412740
spl_filesystem_file_free_line(intern);
27422741
}
27432742
}

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)