Skip to content

Commit 3baf61b

Browse files
committed
- MFH Safer flag handling as requested by Greg
1 parent e2c3c7a commit 3baf61b

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

@@ -175,7 +177,7 @@ PHPAPI char* spl_filesystem_object_get_path(spl_filesystem_object *intern, int *
175177

176178
static inline void spl_filesystem_object_get_file_name(spl_filesystem_object *intern TSRMLS_DC) /* {{{ */
177179
{
178-
char slash = intern->flags & SPL_FILE_DIR_UNIXPATHS ? '/' : DEFAULT_SLASH;
180+
char slash = SPL_HAS_FLAG(intern->flags, SPL_FILE_DIR_UNIXPATHS) ? '/' : DEFAULT_SLASH;
179181

180182
if (!intern->file_name) {
181183
switch (intern->type) {
@@ -215,7 +217,7 @@ static inline int spl_filesystem_is_dot(const char * d_name) /* {{{ */
215217
/* open a directory resource */
216218
static void spl_filesystem_dir_open(spl_filesystem_object* intern, char *path TSRMLS_DC)
217219
{
218-
int skip_dots = intern->flags & SPL_FILE_DIR_SKIPDOTS;
220+
int skip_dots = SPL_HAS_FLAG(intern->flags, SPL_FILE_DIR_SKIPDOTS);
219221

220222
intern->type = SPL_FS_DIR;
221223
intern->_path_len = strlen(path);
@@ -314,7 +316,7 @@ static zend_object_value spl_filesystem_object_clone(zval *zobject TSRMLS_DC)
314316
case SPL_FS_DIR:
315317
spl_filesystem_dir_open(intern, source->_path TSRMLS_CC);
316318
/* read until we hit the position in which we were before */
317-
skip_dots = source->flags & SPL_FILE_DIR_SKIPDOTS;
319+
skip_dots = SPL_HAS_FLAG(source->flags, SPL_FILE_DIR_SKIPDOTS);
318320
for(index = 0; index < source->u.dir.index; ++index) {
319321
do {
320322
spl_filesystem_dir_read(intern TSRMLS_CC);
@@ -600,7 +602,7 @@ static HashTable* spl_filesystem_object_get_debug_info(zval *obj, int *is_temp T
600602
#define DIT_CTOR_FLAGS 0x00000001
601603
#define DIT_CTOR_GLOB 0x00000002
602604

603-
void spl_filesystem_object_construct(INTERNAL_FUNCTION_PARAMETERS, int ctor_flags) /* {{{ */
605+
void spl_filesystem_object_construct(INTERNAL_FUNCTION_PARAMETERS, long ctor_flags) /* {{{ */
604606
{
605607
spl_filesystem_object *intern;
606608
char *path;
@@ -610,17 +612,17 @@ void spl_filesystem_object_construct(INTERNAL_FUNCTION_PARAMETERS, int ctor_flag
610612

611613
zend_replace_error_handling(EH_THROW, spl_ce_UnexpectedValueException, &error_handling TSRMLS_CC);
612614

613-
if (ctor_flags & DIT_CTOR_FLAGS) {
615+
if (SPL_HAS_FLAG(ctor_flags, DIT_CTOR_FLAGS)) {
614616
flags = SPL_FILE_DIR_KEY_AS_PATHNAME|SPL_FILE_DIR_CURRENT_AS_FILEINFO;
615617
parsed = zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|l", &path, &len, &flags);
616618
} else {
617619
flags = SPL_FILE_DIR_KEY_AS_PATHNAME|SPL_FILE_DIR_CURRENT_AS_SELF;
618620
parsed = zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &path, &len);
619621
}
620-
if (ctor_flags & SPL_FILE_DIR_SKIPDOTS) {
622+
if (SPL_HAS_FLAG(ctor_flags, SPL_FILE_DIR_SKIPDOTS)) {
621623
flags |= SPL_FILE_DIR_SKIPDOTS;
622624
}
623-
if (ctor_flags & SPL_FILE_DIR_UNIXPATHS) {
625+
if (SPL_HAS_FLAG(ctor_flags, SPL_FILE_DIR_UNIXPATHS)) {
624626
flags |= SPL_FILE_DIR_UNIXPATHS;
625627
}
626628
if (parsed == FAILURE) {
@@ -635,7 +637,7 @@ void spl_filesystem_object_construct(INTERNAL_FUNCTION_PARAMETERS, int ctor_flag
635637

636638
intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
637639
intern->flags = flags;
638-
if ((ctor_flags & DIT_CTOR_GLOB) && strstr(path, "glob://") != path) {
640+
if (SPL_HAS_FLAG(ctor_flags, DIT_CTOR_GLOB) && strstr(path, "glob://") != path) {
639641
spprintf(&path, 0, "glob://%s", path);
640642
spl_filesystem_dir_open(intern, path TSRMLS_CC);
641643
efree(path);
@@ -698,7 +700,7 @@ SPL_METHOD(DirectoryIterator, current)
698700
SPL_METHOD(DirectoryIterator, next)
699701
{
700702
spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
701-
int skip_dots = intern->flags & SPL_FILE_DIR_SKIPDOTS;
703+
int skip_dots = SPL_HAS_FLAG(intern->flags, SPL_FILE_DIR_SKIPDOTS);
702704

703705
intern->u.dir.index++;
704706
do {
@@ -1262,7 +1264,7 @@ SPL_METHOD(RecursiveDirectoryIterator, getChildren)
12621264
zval zpath, zflags;
12631265
spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
12641266
spl_filesystem_object *subdir;
1265-
char slash = intern->flags & SPL_FILE_DIR_UNIXPATHS ? '/' : DEFAULT_SLASH;
1267+
char slash = SPL_HAS_FLAG(intern->flags, SPL_FILE_DIR_UNIXPATHS) ? '/' : DEFAULT_SLASH;
12661268

12671269
spl_filesystem_object_get_file_name(intern TSRMLS_CC);
12681270

@@ -1309,7 +1311,7 @@ SPL_METHOD(RecursiveDirectoryIterator, getSubPathname)
13091311
spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
13101312
char *sub_name;
13111313
int len;
1312-
char slash = intern->flags & SPL_FILE_DIR_UNIXPATHS ? '/' : DEFAULT_SLASH;
1314+
char slash = SPL_HAS_FLAG(intern->flags, SPL_FILE_DIR_UNIXPATHS) ? '/' : DEFAULT_SLASH;
13131315

13141316
if (intern->u.dir.sub_path) {
13151317
len = spprintf(&sub_name, 0, "%s%c%s", intern->u.dir.sub_path, slash, intern->u.dir.entry.d_name);
@@ -1764,7 +1766,7 @@ static int spl_filesystem_file_read(spl_filesystem_object *intern, int silent TS
17641766
intern->u.file.current_line = estrdup("");
17651767
intern->u.file.current_line_len = 0;
17661768
} else {
1767-
if (intern->flags & SPL_FILE_OBJECT_DROP_NEW_LINE) {
1769+
if (SPL_HAS_FLAG(intern->flags, SPL_FILE_OBJECT_DROP_NEW_LINE)) {
17681770
line_len = strcspn(buf, "\r\n");
17691771
buf[line_len] = '\0';
17701772
}
@@ -1845,7 +1847,7 @@ static int spl_filesystem_file_read_csv(spl_filesystem_object *intern, char deli
18451847

18461848
do {
18471849
ret = spl_filesystem_file_read(intern, 1 TSRMLS_CC);
1848-
} while (ret == SUCCESS && !intern->u.file.current_line_len && (intern->flags & SPL_FILE_OBJECT_SKIP_EMPTY));
1850+
} while (ret == SUCCESS && !intern->u.file.current_line_len && SPL_HAS_FLAG(intern->flags, SPL_FILE_OBJECT_SKIP_EMPTY));
18491851

18501852
if (ret == SUCCESS) {
18511853
size_t buf_len = intern->u.file.current_line_len;
@@ -1874,14 +1876,14 @@ static int spl_filesystem_file_read_line_ex(zval * this_ptr, spl_filesystem_obje
18741876
zval *retval = NULL;
18751877

18761878
/* 1) use fgetcsv? 2) overloaded call the function, 3) do it directly */
1877-
if (intern->flags & SPL_FILE_OBJECT_READ_CSV || intern->u.file.func_getCurr->common.scope != spl_ce_SplFileObject) {
1879+
if (SPL_HAS_FLAG(intern->flags, SPL_FILE_OBJECT_READ_CSV) || intern->u.file.func_getCurr->common.scope != spl_ce_SplFileObject) {
18781880
if (php_stream_eof(intern->u.file.stream)) {
18791881
if (!silent) {
18801882
zend_throw_exception_ex(spl_ce_RuntimeException, 0 TSRMLS_CC, "Cannot read from file %s", intern->file_name);
18811883
}
18821884
return FAILURE;
18831885
}
1884-
if (intern->flags & SPL_FILE_OBJECT_READ_CSV) {
1886+
if (SPL_HAS_FLAG(intern->flags, SPL_FILE_OBJECT_READ_CSV)) {
18851887
return spl_filesystem_file_read_csv(intern, intern->u.file.delimiter, intern->u.file.enclosure, intern->u.file.escape, NULL TSRMLS_CC);
18861888
} else {
18871889
zend_call_method_with_0_params(&this_ptr, Z_OBJCE_P(getThis()), &intern->u.file.func_getCurr, "getCurrentLine", &retval);
@@ -1917,7 +1919,7 @@ static int spl_filesystem_file_is_empty_line(spl_filesystem_object *intern TSRML
19171919
case IS_STRING:
19181920
return Z_STRLEN_P(intern->u.file.current_zval) == 0;
19191921
case IS_ARRAY:
1920-
if ((intern->flags & SPL_FILE_OBJECT_READ_CSV)
1922+
if (SPL_HAS_FLAG(intern->flags, SPL_FILE_OBJECT_READ_CSV)
19211923
&& zend_hash_num_elements(Z_ARRVAL_P(intern->u.file.current_zval)) == 1) {
19221924
zval ** first = Z_ARRVAL_P(intern->u.file.current_zval)->pListHead->pData;
19231925

@@ -1939,7 +1941,7 @@ static int spl_filesystem_file_read_line(zval * this_ptr, spl_filesystem_object
19391941
{
19401942
int ret = spl_filesystem_file_read_line_ex(this_ptr, intern, silent TSRMLS_CC);
19411943

1942-
while ((intern->flags & SPL_FILE_OBJECT_SKIP_EMPTY) && ret == SUCCESS && spl_filesystem_file_is_empty_line(intern TSRMLS_CC)) {
1944+
while (SPL_HAS_FLAG(intern->flags, SPL_FILE_OBJECT_SKIP_EMPTY) && ret == SUCCESS && spl_filesystem_file_is_empty_line(intern TSRMLS_CC)) {
19431945
spl_filesystem_file_free_line(intern TSRMLS_CC);
19441946
ret = spl_filesystem_file_read_line_ex(this_ptr, intern, silent TSRMLS_CC);
19451947
}
@@ -1956,7 +1958,7 @@ static void spl_filesystem_file_rewind(zval * this_ptr, spl_filesystem_object *i
19561958
spl_filesystem_file_free_line(intern TSRMLS_CC);
19571959
intern->u.file.current_line_num = 0;
19581960
}
1959-
if (intern->flags & SPL_FILE_OBJECT_READ_AHEAD) {
1961+
if (SPL_HAS_FLAG(intern->flags, SPL_FILE_OBJECT_READ_AHEAD)) {
19601962
spl_filesystem_file_read_line(this_ptr, intern, 1 TSRMLS_CC);
19611963
}
19621964
} /* }}} */
@@ -2076,7 +2078,7 @@ SPL_METHOD(SplFileObject, valid)
20762078
{
20772079
spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
20782080

2079-
if (intern->flags & SPL_FILE_OBJECT_READ_AHEAD) {
2081+
if (SPL_HAS_FLAG(intern->flags, SPL_FILE_OBJECT_READ_AHEAD)) {
20802082
RETURN_BOOL(intern->u.file.current_line || intern->u.file.current_zval);
20812083
} else {
20822084
RETVAL_BOOL(!php_stream_eof(intern->u.file.stream));
@@ -2104,7 +2106,7 @@ SPL_METHOD(SplFileObject, current)
21042106
if (!intern->u.file.current_line && !intern->u.file.current_zval) {
21052107
spl_filesystem_file_read_line(getThis(), intern, 1 TSRMLS_CC);
21062108
}
2107-
if (intern->u.file.current_line && (!(intern->flags & SPL_FILE_OBJECT_READ_CSV) || !intern->u.file.current_zval)) {
2109+
if (intern->u.file.current_line && (!SPL_HAS_FLAG(intern->flags, SPL_FILE_OBJECT_READ_CSV) || !intern->u.file.current_zval)) {
21082110
RETURN_STRINGL(intern->u.file.current_line, intern->u.file.current_line_len, 1);
21092111
} else if (intern->u.file.current_zval) {
21102112
RETURN_ZVAL(intern->u.file.current_zval, 1, 0);
@@ -2132,7 +2134,7 @@ SPL_METHOD(SplFileObject, next)
21322134
spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
21332135

21342136
spl_filesystem_file_free_line(intern TSRMLS_CC);
2135-
if (intern->flags & SPL_FILE_OBJECT_READ_AHEAD) {
2137+
if (SPL_HAS_FLAG(intern->flags, SPL_FILE_OBJECT_READ_AHEAD)) {
21362138
spl_filesystem_file_read_line(getThis(), intern, 1 TSRMLS_CC);
21372139
}
21382140
intern->u.file.current_line_num++;

0 commit comments

Comments
 (0)