From: Anatol Belski Date: Fri, 29 Aug 2014 11:30:53 +0000 (+0200) Subject: fix implicit st_rdev element handling when negative value was passed X-Git-Tag: PRE_PHP7_REMOVALS~198 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=13ccda724988d30d0522207344c0e4f9b0cdc2b4;p=php fix implicit st_rdev element handling when negative value was passed --- diff --git a/ext/standard/file.c b/ext/standard/file.c index d9fa64ec6a..21f9a752e3 100644 --- a/ext/standard/file.c +++ b/ext/standard/file.c @@ -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 diff --git a/ext/standard/filestat.c b/ext/standard/filestat.c index 216e5b2779..992f99d24e 100644 --- a/ext/standard/filestat.c +++ b/ext/standard/filestat.c @@ -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