mirror of
https://github.com/php/php-src.git
synced 2024-09-21 18:07:23 +00:00
Merge branch 'PHP-8.3'
* PHP-8.3: Fix GH-12721: SplFileInfo::getFilename() segfault in combination with GlobIterator and no directory separator
This commit is contained in:
commit
a963b1fbd9
@ -913,7 +913,6 @@ PHP_METHOD(SplFileInfo, getFilename)
|
||||
|
||||
path = spl_filesystem_object_get_path(intern);
|
||||
|
||||
ZEND_ASSERT(path);
|
||||
if (path && ZSTR_LEN(path) && ZSTR_LEN(path) < ZSTR_LEN(intern->file_name)) {
|
||||
/* +1 to skip the trailing / of the path in the file name */
|
||||
size_t path_len = ZSTR_LEN(path) + 1;
|
||||
@ -921,7 +920,9 @@ PHP_METHOD(SplFileInfo, getFilename)
|
||||
} else {
|
||||
RETVAL_STR_COPY(intern->file_name);
|
||||
}
|
||||
zend_string_release_ex(path, /* persistent */ false);
|
||||
if (path) {
|
||||
zend_string_release_ex(path, /* persistent */ false);
|
||||
}
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
@ -961,14 +962,16 @@ PHP_METHOD(SplFileInfo, getExtension)
|
||||
|
||||
path = spl_filesystem_object_get_path(intern);
|
||||
|
||||
if (ZSTR_LEN(path) && ZSTR_LEN(path) < ZSTR_LEN(intern->file_name)) {
|
||||
if (path && ZSTR_LEN(path) && ZSTR_LEN(path) < ZSTR_LEN(intern->file_name)) {
|
||||
fname = ZSTR_VAL(intern->file_name) + ZSTR_LEN(path) + 1;
|
||||
flen = ZSTR_LEN(intern->file_name) - (ZSTR_LEN(path) + 1);
|
||||
} else {
|
||||
fname = ZSTR_VAL(intern->file_name);
|
||||
flen = ZSTR_LEN(intern->file_name);
|
||||
}
|
||||
zend_string_release_ex(path, /* persistent */ false);
|
||||
if (path) {
|
||||
zend_string_release_ex(path, /* persistent */ false);
|
||||
}
|
||||
|
||||
ret = php_basename(fname, flen, NULL, 0);
|
||||
|
||||
@ -1040,7 +1043,9 @@ PHP_METHOD(SplFileInfo, getBasename)
|
||||
fname = ZSTR_VAL(intern->file_name);
|
||||
flen = ZSTR_LEN(intern->file_name);
|
||||
}
|
||||
zend_string_release_ex(path, /* persistent */ false);
|
||||
if (path) {
|
||||
zend_string_release_ex(path, /* persistent */ false);
|
||||
}
|
||||
|
||||
RETURN_STR(php_basename(fname, flen, suffix, slen));
|
||||
}
|
||||
|
51
ext/spl/tests/gh12721.phpt
Normal file
51
ext/spl/tests/gh12721.phpt
Normal file
@ -0,0 +1,51 @@
|
||||
--TEST--
|
||||
GH-12721 (SplFileInfo::getFilename() segfault in combination with GlobIterator and no directory separator)
|
||||
--FILE--
|
||||
<?php
|
||||
|
||||
file_put_contents('file1.gh12721', 'hello');
|
||||
|
||||
echo "--- No slash ---\n";
|
||||
|
||||
foreach (new GlobIterator('*.gh12721') as $fileInfo) {
|
||||
echo $fileInfo->getFilename(), "\n";
|
||||
echo $fileInfo->getExtension(), "\n";
|
||||
echo $fileInfo->getBasename(), "\n";
|
||||
var_dump($fileInfo->getFileInfo());
|
||||
}
|
||||
|
||||
echo "--- With slash ---\n";
|
||||
|
||||
foreach (new GlobIterator('./*.gh12721') as $fileInfo) {
|
||||
echo $fileInfo->getFilename(), "\n";
|
||||
echo $fileInfo->getExtension(), "\n";
|
||||
echo $fileInfo->getBasename(), "\n";
|
||||
var_dump($fileInfo->getFileInfo());
|
||||
}
|
||||
|
||||
?>
|
||||
--CLEAN--
|
||||
<?php
|
||||
@unlink('file1.gh12721');
|
||||
?>
|
||||
--EXPECTF--
|
||||
--- No slash ---
|
||||
file1.gh12721
|
||||
gh12721
|
||||
file1.gh12721
|
||||
object(SplFileInfo)#4 (2) {
|
||||
["pathName":"SplFileInfo":private]=>
|
||||
string(13) "file1.gh12721"
|
||||
["fileName":"SplFileInfo":private]=>
|
||||
string(13) "file1.gh12721"
|
||||
}
|
||||
--- With slash ---
|
||||
file1.gh12721
|
||||
gh12721
|
||||
file1.gh12721
|
||||
object(SplFileInfo)#3 (2) {
|
||||
["pathName":"SplFileInfo":private]=>
|
||||
string(15) "%sfile1.gh12721"
|
||||
["fileName":"SplFileInfo":private]=>
|
||||
string(13) "file1.gh12721"
|
||||
}
|
Loading…
Reference in New Issue
Block a user