Hello Greg,
Wednesday, February 11, 2009, 6:07:27 AM, you wrote:
> 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;
While I wouldn't mind this part, I don't see a reason for it (and it
generates slower code, though any file access of course is a million times
slower anyway). Either way, we only do non zero checks, so that it doesn't
matter whether the result is one of 0 and 1 or 0 and something non zero.
If there is a compiler warning, then that can only come from flags being
long and we would need to switch from 'int skip_dots' to 'long skip_dots'.
>
> 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) /* {{{ */
Sounds fine.
> {
> 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 {
Best regards,
Marcus
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php