Skip to content

Commit b43851b

Browse files
committed
- Safer flag handling as requested by Greg
1 parent 4d616e7 commit b43851b

File tree

1 file changed

+23
-21
lines changed

1 file changed

+23
-21
lines changed

ext/spl/spl_directory.c

+23-21
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@
4444
#include "ext/standard/basic_functions.h"
4545
#include "ext/standard/php_filestat.h"
4646

47+
#define SPL_HAS_FLAG(flags, test_flag) ((flags & test_flag) ? 1 : 0)
48+
4749
/* declare the class handlers */
4850
static zend_object_handlers spl_filesystem_object_handlers;
4951

@@ -185,7 +187,7 @@ static inline void spl_filesystem_object_get_file_name(spl_filesystem_object *in
185187
{
186188
zstr path;
187189
zend_uchar path_type;
188-
char slash = intern->flags & SPL_FILE_DIR_UNIXPATHS ? '/' : DEFAULT_SLASH;
190+
char slash = SPL_HAS_FLAG(intern->flags, SPL_FILE_DIR_UNIXPATHS) ? '/' : DEFAULT_SLASH;
189191

190192
if (!intern->file_name.v) {
191193
switch (intern->type) {
@@ -228,7 +230,7 @@ static inline int spl_filesystem_is_dot(const char * d_name) /* {{{ */
228230
static void spl_filesystem_dir_open(spl_filesystem_object* intern, zend_uchar type, zstr path, int path_len TSRMLS_DC)
229231
{
230232
int options = REPORT_ERRORS;
231-
int skip_dots = intern->flags & SPL_FILE_DIR_SKIPDOTS;
233+
int skip_dots = SPL_HAS_FLAG(intern->flags, SPL_FILE_DIR_SKIPDOTS);
232234

233235
#if HELLY_0
234236
if (php_stream_is(intern->u.dir.dirp, &php_glob_stream_ops)) {
@@ -322,7 +324,7 @@ static zend_object_value spl_filesystem_object_clone(zval *zobject TSRMLS_DC)
322324
old_object = zend_objects_get_address(zobject TSRMLS_CC);
323325
source = (spl_filesystem_object*)old_object;
324326

325-
skip_dots = source->flags & SPL_FILE_DIR_SKIPDOTS;
327+
skip_dots = SPL_HAS_FLAG(source->flags, SPL_FILE_DIR_SKIPDOTS);
326328

327329
new_obj_val = spl_filesystem_object_new_ex(old_object->ce, &intern TSRMLS_CC);
328330
new_object = &intern->std;
@@ -666,7 +668,7 @@ static HashTable* spl_filesystem_object_get_debug_info(zval *obj, int *is_temp T
666668

667669
UChar u_glob[sizeof("glob://")];
668670

669-
void spl_filesystem_object_construct(INTERNAL_FUNCTION_PARAMETERS, int ctor_flags) /* {{{ */
671+
void spl_filesystem_object_construct(INTERNAL_FUNCTION_PARAMETERS, long ctor_flags) /* {{{ */
670672
{
671673
spl_filesystem_object *intern;
672674
zstr path;
@@ -677,19 +679,19 @@ void spl_filesystem_object_construct(INTERNAL_FUNCTION_PARAMETERS, int ctor_flag
677679

678680
zend_replace_error_handling(EH_THROW, spl_ce_RuntimeException, &error_handling TSRMLS_CC);
679681

680-
if (ctor_flags & DIT_CTOR_FLAGS) {
682+
if (SPL_HAS_FLAG(ctor_flags, DIT_CTOR_FLAGS)) {
681683
flags = SPL_FILE_DIR_KEY_AS_PATHNAME|SPL_FILE_DIR_CURRENT_AS_FILEINFO;
682684
parsed = zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "t|l", &path, &len, &path_type, &flags);
683685
} else {
684686
flags = SPL_FILE_DIR_KEY_AS_PATHNAME|SPL_FILE_DIR_CURRENT_AS_SELF;
685687
parsed = zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "t", &path, &len, &path_type);
686688
}
687689

688-
if (ctor_flags & SPL_FILE_DIR_SKIPDOTS) {
690+
if (SPL_HAS_FLAG(ctor_flags, SPL_FILE_DIR_SKIPDOTS)) {
689691
flags |= SPL_FILE_DIR_SKIPDOTS;
690692
}
691693

692-
if (ctor_flags & SPL_FILE_DIR_UNIXPATHS) {
694+
if (SPL_HAS_FLAG(ctor_flags, SPL_FILE_DIR_UNIXPATHS)) {
693695
flags |= SPL_FILE_DIR_UNIXPATHS;
694696
}
695697

@@ -706,7 +708,7 @@ void spl_filesystem_object_construct(INTERNAL_FUNCTION_PARAMETERS, int ctor_flag
706708
intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
707709
intern->flags = flags;
708710

709-
if ((ctor_flags & DIT_CTOR_GLOB) && (
711+
if (SPL_HAS_FLAG(ctor_flags, DIT_CTOR_GLOB) && (
710712
(path_type == IS_STRING && strstr(path.s, "glob://") != path.s) ||
711713
(path_type == IS_UNICODE && u_strstr(path.u, u_glob) != path.u)
712714
)) {
@@ -771,7 +773,7 @@ SPL_METHOD(DirectoryIterator, current)
771773
SPL_METHOD(DirectoryIterator, next)
772774
{
773775
spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
774-
int skip_dots = intern->flags & SPL_FILE_DIR_SKIPDOTS;
776+
int skip_dots = SPL_HAS_FLAG(intern->flags, SPL_FILE_DIR_SKIPDOTS);
775777

776778
intern->u.dir.index++;
777779
do {
@@ -1388,7 +1390,7 @@ SPL_METHOD(RecursiveDirectoryIterator, getChildren)
13881390
zval zpath, zflags;
13891391
spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
13901392
spl_filesystem_object *subdir;
1391-
char slash = intern->flags & SPL_FILE_DIR_UNIXPATHS ? '/' : DEFAULT_SLASH;
1393+
char slash = SPL_HAS_FLAG(intern->flags, SPL_FILE_DIR_UNIXPATHS) ? '/' : DEFAULT_SLASH;
13921394

13931395
spl_filesystem_object_get_file_name(intern TSRMLS_CC);
13941396

@@ -1439,7 +1441,7 @@ SPL_METHOD(RecursiveDirectoryIterator, getSubPathname)
14391441
spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
14401442
zstr sub_name;
14411443
int sub_len;
1442-
char slash = intern->flags & SPL_FILE_DIR_UNIXPATHS ? '/' : DEFAULT_SLASH;
1444+
char slash = SPL_HAS_FLAG(intern->flags, SPL_FILE_DIR_UNIXPATHS) ? '/' : DEFAULT_SLASH;
14431445

14441446
if (intern->u.dir.sub_path.v) {
14451447
sub_len = zspprintf(intern->u.dir.sub_path_type, &sub_name, 0, "%R%c%s", intern->u.dir.sub_path_type, intern->u.dir.sub_path, slash, intern->u.dir.entry.d_name);
@@ -1912,7 +1914,7 @@ static int spl_filesystem_file_read(spl_filesystem_object *intern, int silent TS
19121914
intern->u.file.current_line = estrdup("");
19131915
intern->u.file.current_line_len = 0;
19141916
} else {
1915-
if (intern->flags & SPL_FILE_OBJECT_DROP_NEW_LINE) {
1917+
if (SPL_HAS_FLAG(intern->flags, SPL_FILE_OBJECT_DROP_NEW_LINE)) {
19161918
line_len = strcspn(buf, "\r\n");
19171919
buf[line_len] = '\0';
19181920
}
@@ -1988,7 +1990,7 @@ static int spl_filesystem_file_read_csv(spl_filesystem_object *intern, char deli
19881990

19891991
do {
19901992
ret = spl_filesystem_file_read(intern, 1 TSRMLS_CC);
1991-
} while (ret == SUCCESS && !intern->u.file.current_line_len && (intern->flags & SPL_FILE_OBJECT_SKIP_EMPTY));
1993+
} while (ret == SUCCESS && !intern->u.file.current_line_len && SPL_HAS_FLAG(intern->flags, SPL_FILE_OBJECT_SKIP_EMPTY));
19921994

19931995
if (ret == SUCCESS) {
19941996
size_t buf_len = intern->u.file.current_line_len;
@@ -2017,14 +2019,14 @@ static int spl_filesystem_file_read_line_ex(zval * this_ptr, spl_filesystem_obje
20172019
zval *retval = NULL;
20182020

20192021
/* 1) use fgetcsv? 2) overloaded call the function, 3) do it directly */
2020-
if (intern->flags & SPL_FILE_OBJECT_READ_CSV || intern->u.file.func_getCurr->common.scope != spl_ce_SplFileObject) {
2022+
if (SPL_HAS_FLAG(intern->flags, SPL_FILE_OBJECT_READ_CSV) || intern->u.file.func_getCurr->common.scope != spl_ce_SplFileObject) {
20212023
if (php_stream_eof(intern->u.file.stream)) {
20222024
if (!silent) {
20232025
zend_throw_exception_ex(spl_ce_RuntimeException, 0 TSRMLS_CC, "Cannot read from file %s", intern->file_name);
20242026
}
20252027
return FAILURE;
20262028
}
2027-
if (intern->flags & SPL_FILE_OBJECT_READ_CSV) {
2029+
if (SPL_HAS_FLAG(intern->flags, SPL_FILE_OBJECT_READ_CSV)) {
20282030
return spl_filesystem_file_read_csv(intern, intern->u.file.delimiter, intern->u.file.enclosure, intern->u.file.escape, NULL TSRMLS_CC);
20292031
} else {
20302032
zend_call_method_with_0_params(&this_ptr, Z_OBJCE_P(getThis()), &intern->u.file.func_getCurr, "getCurrentLine", &retval);
@@ -2061,7 +2063,7 @@ static int spl_filesystem_file_is_empty_line(spl_filesystem_object *intern TSRML
20612063
case IS_UNICODE:
20622064
return Z_STRLEN_P(intern->u.file.current_zval) == 0;
20632065
case IS_ARRAY:
2064-
if ((intern->flags & SPL_FILE_OBJECT_READ_CSV)
2066+
if (SPL_HAS_FLAG(intern->flags, SPL_FILE_OBJECT_READ_CSV)
20652067
&& zend_hash_num_elements(Z_ARRVAL_P(intern->u.file.current_zval)) == 1) {
20662068
zval ** first = Z_ARRVAL_P(intern->u.file.current_zval)->pListHead->pData;
20672069

@@ -2084,7 +2086,7 @@ static int spl_filesystem_file_read_line(zval * this_ptr, spl_filesystem_object
20842086
{
20852087
int ret = spl_filesystem_file_read_line_ex(this_ptr, intern, silent TSRMLS_CC);
20862088

2087-
while ((intern->flags & SPL_FILE_OBJECT_SKIP_EMPTY) && ret == SUCCESS && spl_filesystem_file_is_empty_line(intern TSRMLS_CC)) {
2089+
while (SPL_HAS_FLAG(intern->flags, SPL_FILE_OBJECT_SKIP_EMPTY) && ret == SUCCESS && spl_filesystem_file_is_empty_line(intern TSRMLS_CC)) {
20882090
spl_filesystem_file_free_line(intern TSRMLS_CC);
20892091
ret = spl_filesystem_file_read_line_ex(this_ptr, intern, silent TSRMLS_CC);
20902092
}
@@ -2101,7 +2103,7 @@ static void spl_filesystem_file_rewind(zval * this_ptr, spl_filesystem_object *i
21012103
spl_filesystem_file_free_line(intern TSRMLS_CC);
21022104
intern->u.file.current_line_num = 0;
21032105
}
2104-
if (intern->flags & SPL_FILE_OBJECT_READ_AHEAD) {
2106+
if (SPL_HAS_FLAG(intern->flags, SPL_FILE_OBJECT_READ_AHEAD)) {
21052107
spl_filesystem_file_read_line(this_ptr, intern, 1 TSRMLS_CC);
21062108
}
21072109
} /* }}} */
@@ -2226,7 +2228,7 @@ SPL_METHOD(SplFileObject, valid)
22262228
{
22272229
spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
22282230

2229-
if (intern->flags & SPL_FILE_OBJECT_READ_AHEAD) {
2231+
if (SPL_HAS_FLAG(intern->flags, SPL_FILE_OBJECT_READ_AHEAD)) {
22302232
RETURN_BOOL(intern->u.file.current_line || intern->u.file.current_zval);
22312233
} else {
22322234
RETVAL_BOOL(!php_stream_eof(intern->u.file.stream));
@@ -2254,7 +2256,7 @@ SPL_METHOD(SplFileObject, current)
22542256
if (!intern->u.file.current_line && !intern->u.file.current_zval) {
22552257
spl_filesystem_file_read_line(getThis(), intern, 1 TSRMLS_CC);
22562258
}
2257-
if (intern->u.file.current_line && (!(intern->flags & SPL_FILE_OBJECT_READ_CSV) || !intern->u.file.current_zval)) {
2259+
if (intern->u.file.current_line && (!SPL_HAS_FLAG(intern->flags, SPL_FILE_OBJECT_READ_CSV) || !intern->u.file.current_zval)) {
22582260
RETURN_RT_STRINGL(intern->u.file.current_line, intern->u.file.current_line_len, ZSTR_DUPLICATE);
22592261
} else if (intern->u.file.current_zval) {
22602262
RETURN_ZVAL(intern->u.file.current_zval, 1, 0);
@@ -2282,7 +2284,7 @@ SPL_METHOD(SplFileObject, next)
22822284
spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
22832285

22842286
spl_filesystem_file_free_line(intern TSRMLS_CC);
2285-
if (intern->flags & SPL_FILE_OBJECT_READ_AHEAD) {
2287+
if (SPL_HAS_FLAG(intern->flags, SPL_FILE_OBJECT_READ_AHEAD)) {
22862288
spl_filesystem_file_read_line(getThis(), intern, 1 TSRMLS_CC);
22872289
}
22882290
intern->u.file.current_line_num++;

0 commit comments

Comments
 (0)