int/long conflict in spl?

From: Date: Wed, 11 Feb 2009 05:07:27 +0000
Subject: int/long conflict in spl?
Groups: php.internals 
Request: Send a blank email to internals+get-43058@lists.php.net to get a copy of this message
Hi, While tracking down a problem in one of phar's tests, I found what might be a problem in RecursiveDirectoryIterator's handling of flags. Here is a crude patch demonstrating the issue, and wondering if this is something to be concerned about. Basically, we're mixing long and int, which could lead to truncation in unpredictable ways. Greg Index: spl_directory.c =================================================================== RCS file: /repository/php-src/ext/spl/spl_directory.c,v retrieving revision 1.45.2.27.2.23.2.40 diff -u -r1.45.2.27.2.23.2.40 spl_directory.c
--- spl_directory.c    31 Dec 2008 11:15:43 -0000    1.45.2.27.2.23.2.40
+++ spl_directory.c    15 Feb 2009 21:45:00 -0000
@@ -215,7 +215,7 @@ /* open a directory resource */ static void spl_filesystem_dir_open(spl_filesystem_object* intern, char *path TSRMLS_DC) {
-    int skip_dots = intern->flags & SPL_FILE_DIR_SKIPDOTS;
+    int skip_dots = (intern->flags & SPL_FILE_DIR_SKIPDOTS) ? 1 : 0;
    intern->type = SPL_FS_DIR;
    intern->_path_len = strlen(path);
@@ -314,7 +314,7 @@
    case SPL_FS_DIR:
        spl_filesystem_dir_open(intern, source->_path TSRMLS_CC);
        /* read until we hit the position in which we were before */
-        skip_dots = source->flags & SPL_FILE_DIR_SKIPDOTS;
+        skip_dots = (source->flags & SPL_FILE_DIR_SKIPDOTS) ? 1 : 0;
        for(index = 0; index < source->u.dir.index; ++index) {
            do {
                spl_filesystem_dir_read(intern TSRMLS_CC);
@@ -600,7 +600,7 @@ #define DIT_CTOR_FLAGS 0x00000001 #define DIT_CTOR_GLOB 0x00000002 -void spl_filesystem_object_construct(INTERNAL_FUNCTION_PARAMETERS, int ctor_flags) /* {{{ */ +void spl_filesystem_object_construct(INTERNAL_FUNCTION_PARAMETERS, long ctor_flags) /* {{{ */ {
    spl_filesystem_object *intern;
    char *path;
@@ -698,7 +698,7 @@ SPL_METHOD(DirectoryIterator, next) {
    spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
-    int skip_dots = intern->flags & SPL_FILE_DIR_SKIPDOTS;
+    int skip_dots = (intern->flags & SPL_FILE_DIR_SKIPDOTS) ? 1 : 0;
    intern->u.dir.index++;
    do {


« previous php.internals (#43058) next »