Skip to content

Commit ac7a281

Browse files
committed
Add initialization checks to DirectoryIterator methods
1 parent e258f13 commit ac7a281

File tree

3 files changed

+39
-9
lines changed

3 files changed

+39
-9
lines changed

ext/spl/spl_directory.c

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,12 @@ PHPAPI zend_class_entry *spl_ce_SplTempFileObject;
5858
RETURN_THROWS(); \
5959
}
6060

61+
#define CHECK_DIRECTORY_ITERATOR_IS_INITIALIZED(intern) \
62+
if (!(intern)->u.dir.dirp) { \
63+
zend_throw_error(NULL, "Object not initialized"); \
64+
RETURN_THROWS(); \
65+
}
66+
6167
static void spl_filesystem_file_free_line(spl_filesystem_object *intern) /* {{{ */
6268
{
6369
if (intern->u.file.current_line) {
@@ -768,10 +774,9 @@ PHP_METHOD(DirectoryIterator, rewind)
768774
RETURN_THROWS();
769775
}
770776

777+
CHECK_DIRECTORY_ITERATOR_IS_INITIALIZED(intern);
771778
intern->u.dir.index = 0;
772-
if (intern->u.dir.dirp) {
773-
php_stream_rewinddir(intern->u.dir.dirp);
774-
}
779+
php_stream_rewinddir(intern->u.dir.dirp);
775780
spl_filesystem_dir_read(intern);
776781
}
777782
/* }}} */
@@ -785,11 +790,8 @@ PHP_METHOD(DirectoryIterator, key)
785790
RETURN_THROWS();
786791
}
787792

788-
if (intern->u.dir.dirp) {
789-
RETURN_LONG(intern->u.dir.index);
790-
} else {
791-
RETURN_FALSE;
792-
}
793+
CHECK_DIRECTORY_ITERATOR_IS_INITIALIZED(intern);
794+
RETURN_LONG(intern->u.dir.index);
793795
}
794796
/* }}} */
795797

@@ -799,6 +801,8 @@ PHP_METHOD(DirectoryIterator, current)
799801
if (zend_parse_parameters_none() == FAILURE) {
800802
RETURN_THROWS();
801803
}
804+
805+
CHECK_DIRECTORY_ITERATOR_IS_INITIALIZED(Z_SPLFILESYSTEM_P(ZEND_THIS));
802806
RETURN_OBJ_COPY(Z_OBJ_P(ZEND_THIS));
803807
}
804808
/* }}} */
@@ -813,6 +817,7 @@ PHP_METHOD(DirectoryIterator, next)
813817
RETURN_THROWS();
814818
}
815819

820+
CHECK_DIRECTORY_ITERATOR_IS_INITIALIZED(intern);
816821
intern->u.dir.index++;
817822
do {
818823
spl_filesystem_dir_read(intern);
@@ -835,6 +840,7 @@ PHP_METHOD(DirectoryIterator, seek)
835840
RETURN_THROWS();
836841
}
837842

843+
CHECK_DIRECTORY_ITERATOR_IS_INITIALIZED(intern);
838844
if (intern->u.dir.index > pos) {
839845
/* we first rewind */
840846
zend_call_method_with_0_params(Z_OBJ_P(ZEND_THIS), Z_OBJCE_P(ZEND_THIS), &intern->u.dir.func_rewind, "rewind", NULL);
@@ -862,6 +868,7 @@ PHP_METHOD(DirectoryIterator, valid)
862868
RETURN_THROWS();
863869
}
864870

871+
CHECK_DIRECTORY_ITERATOR_IS_INITIALIZED(intern);
865872
RETURN_BOOL(intern->u.dir.entry.d_name[0] != '\0');
866873
}
867874
/* }}} */
@@ -920,6 +927,7 @@ PHP_METHOD(DirectoryIterator, getFilename)
920927
RETURN_THROWS();
921928
}
922929

930+
CHECK_DIRECTORY_ITERATOR_IS_INITIALIZED(intern);
923931
RETURN_STRING(intern->u.dir.entry.d_name);
924932
}
925933
/* }}} */
@@ -981,6 +989,7 @@ PHP_METHOD(DirectoryIterator, getExtension)
981989
RETURN_THROWS();
982990
}
983991

992+
CHECK_DIRECTORY_ITERATOR_IS_INITIALIZED(intern);
984993
fname = php_basename(intern->u.dir.entry.d_name, strlen(intern->u.dir.entry.d_name), NULL, 0);
985994

986995
p = zend_memrchr(ZSTR_VAL(fname), '.', ZSTR_LEN(fname));
@@ -1038,6 +1047,7 @@ PHP_METHOD(DirectoryIterator, getBasename)
10381047
RETURN_THROWS();
10391048
}
10401049

1050+
CHECK_DIRECTORY_ITERATOR_IS_INITIALIZED(intern);
10411051
fname = php_basename(intern->u.dir.entry.d_name, strlen(intern->u.dir.entry.d_name), suffix, slen);
10421052

10431053
RETVAL_STR(fname);
@@ -1116,6 +1126,7 @@ PHP_METHOD(DirectoryIterator, isDot)
11161126
RETURN_THROWS();
11171127
}
11181128

1129+
CHECK_DIRECTORY_ITERATOR_IS_INITIALIZED(intern);
11191130
RETURN_BOOL(spl_filesystem_is_dot(intern->u.dir.entry.d_name));
11201131
}
11211132
/* }}} */

ext/spl/spl_directory.stub.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ public function rewind() {}
122122
/** @return bool */
123123
public function valid() {}
124124

125-
/** @return int|false */
125+
/** @return int */
126126
public function key() {}
127127

128128
/** @return DirectoryIterator */
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
--TEST--
2+
Using an uninitialized DirectoryIterator
3+
--FILE--
4+
<?php
5+
6+
class MyDirectoryIterator extends DirectoryIterator {
7+
public function __construct() {}
8+
}
9+
10+
$it = new MyDirectoryIterator;
11+
try {
12+
$it->key();
13+
} catch (Error $e) {
14+
echo $e->getMessage(), "\n";
15+
}
16+
17+
?>
18+
--EXPECT--
19+
Object not initialized

0 commit comments

Comments
 (0)