@@ -543,6 +543,7 @@ PHP_FUNCTION(clearstatcache)
543
543
#define IS_LINK_OPERATION (__t ) ((__t) == FS_TYPE || (__t) == FS_IS_LINK || (__t) == FS_LSTAT)
544
544
#define IS_EXISTS_CHECK (__t ) ((__t) == FS_EXISTS || (__t) == FS_IS_W || (__t) == FS_IS_R || (__t) == FS_IS_X || (__t) == FS_IS_FILE || (__t) == FS_IS_DIR || (__t) == FS_IS_LINK)
545
545
#define IS_ABLE_CHECK (__t ) ((__t) == FS_IS_R || (__t) == FS_IS_W || (__t) == FS_IS_X)
546
+ #define IS_ACCESS_CHECK (__t ) (IS_ABLE_CHECK(type) || (__t) == FS_EXISTS)
546
547
547
548
/* {{{ php_stat
548
549
*/
@@ -560,6 +561,35 @@ PHPAPI void php_stat(const char *filename, php_stat_len filename_length, int typ
560
561
RETURN_FALSE ;
561
562
}
562
563
564
+ if (IS_ACCESS_CHECK (type )) {
565
+ char * local ;
566
+
567
+ if (php_stream_locate_url_wrapper (filename , & local , 0 TSRMLS_CC ) == & php_plain_files_wrapper ) {
568
+ switch (type ) {
569
+ #ifdef F_OK
570
+ case FS_EXISTS :
571
+ RETURN_BOOL (VCWD_ACCESS (local , F_OK ) == 0 );
572
+ break ;
573
+ #endif
574
+ #ifdef W_OK
575
+ case FS_IS_W :
576
+ RETURN_BOOL (VCWD_ACCESS (local , W_OK ) == 0 );
577
+ break ;
578
+ #endif
579
+ #ifdef R_OK
580
+ case FS_IS_R :
581
+ RETURN_BOOL (VCWD_ACCESS (local , R_OK ) == 0 );
582
+ break ;
583
+ #endif
584
+ #ifdef X_OK
585
+ case FS_IS_X :
586
+ RETURN_BOOL (VCWD_ACCESS (local , X_OK ) == 0 );
587
+ break ;
588
+ #endif
589
+ }
590
+ }
591
+ }
592
+
563
593
if (IS_LINK_OPERATION (type )) {
564
594
flags |= PHP_STREAM_URL_STAT_LINK ;
565
595
}
@@ -617,7 +647,7 @@ PHPAPI void php_stat(const char *filename, php_stat_len filename_length, int typ
617
647
php_stream_wrapper * wrapper ;
618
648
619
649
wrapper = php_stream_locate_url_wrapper (filename , NULL , 0 TSRMLS_CC );
620
- if (wrapper && wrapper -> wops && wrapper -> wops -> label && strcmp ( wrapper -> wops -> label , "plainfile" ) == 0 ) {
650
+ if (wrapper == & php_plain_files_wrapper ) {
621
651
if (type == FS_IS_X ) {
622
652
xmask = S_IXROOT ;
623
653
} else {
0 commit comments