]> granicus.if.org Git - php/commitdiff
fix implicit st_rdev element handling when negative value was passed
authorAnatol Belski <ab@php.net>
Fri, 29 Aug 2014 11:30:53 +0000 (13:30 +0200)
committerAnatol Belski <ab@php.net>
Fri, 29 Aug 2014 11:30:53 +0000 (13:30 +0200)
ext/standard/file.c
ext/standard/filestat.c

index d9fa64ec6a6ccf7b7783daac7e75ccf3bc7a02ae..21f9a752e338c8a50c8a2e0019f3a97f23a92993 100644 (file)
@@ -1577,7 +1577,19 @@ PHP_NAMED_FUNCTION(php_if_fstat)
        ZVAL_LONG(&stat_uid, stat_ssb.sb.st_uid);
        ZVAL_LONG(&stat_gid, stat_ssb.sb.st_gid);
 #ifdef HAVE_ST_RDEV
+# ifdef PHP_WIN32
+       /* It is unsigned, so if a negative came from userspace, it'll
+          convert to UINT_MAX, but we wan't to keep the userspace value.
+          Almost the same as in php_fstat. This is ugly, but otherwise
+          we would have to maintain a fully compatible struct stat. */
+       if ((int)stat_ssb.sb.st_rdev < 0) {
+               ZVAL_LONG(&stat_rdev, (int)stat_ssb.sb.st_rdev);
+       } else {
+               ZVAL_LONG(&stat_rdev, stat_ssb.sb.st_rdev);
+       }
+# else
        ZVAL_LONG(&stat_rdev, stat_ssb.sb.st_rdev);
+# endif
 #else
        ZVAL_LONG(&stat_rdev, -1);
 #endif
index 216e5b27795b6733ef797d422b8651e229c50648..992f99d24ee8aae178b19b65c3e47bf01156e868 100644 (file)
@@ -1019,7 +1019,18 @@ PHPAPI void php_stat(const char *filename, php_stat_len filename_length, int typ
                ZVAL_LONG(&stat_uid, stat_sb->st_uid);
                ZVAL_LONG(&stat_gid, stat_sb->st_gid);
 #ifdef HAVE_ST_RDEV
+# ifdef PHP_WIN32
+       /* It is unsigned, so if a negative came from userspace, it'll
+          convert to UINT_MAX, but we wan't to keep the userspace value.
+          Almost the same as in php_if_fstat. */
+       if ((int)stat_sb->st_rdev < 0) {
+               ZVAL_LONG(&stat_rdev, (int)stat_sb->st_rdev);
+       } else {
                ZVAL_LONG(&stat_rdev, stat_sb->st_rdev);
+       }
+# else
+       ZVAL_LONG(&stat_rdev, stat_sb->st_rdev);
+# endif
 #else
                ZVAL_LONG(&stat_rdev, -1);
 #endif