@@ -93,6 +93,8 @@ static cwd_state main_cwd_state; /* True global */
93
93
#include <unistd.h>
94
94
#else
95
95
#include <direct.h>
96
+ #include "zend_globals.h"
97
+ #include "zend_globals_macros.h"
96
98
#endif
97
99
98
100
#define CWD_STATE_COPY (d , s ) \
@@ -608,6 +610,7 @@ static size_t tsrm_realpath_r(char *path, size_t start, size_t len, int *ll, tim
608
610
tmp = do_alloca (len + 1 , use_heap );
609
611
memcpy (tmp , path , len + 1 );
610
612
613
+ retry :
611
614
if (save &&
612
615
!(IS_UNC_PATH (path , len ) && len >= 3 && path [2 ] != '?' ) &&
613
616
(dataw .dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT )
@@ -655,7 +658,21 @@ static size_t tsrm_realpath_r(char *path, size_t start, size_t len, int *ll, tim
655
658
return (size_t )- 1 ;
656
659
}
657
660
if (!DeviceIoControl (hLink , FSCTL_GET_REPARSE_POINT , NULL , 0 , pbuffer , MAXIMUM_REPARSE_DATA_BUFFER_SIZE , & retlength , NULL )) {
661
+ BY_HANDLE_FILE_INFORMATION fileInformation ;
662
+
658
663
free_alloca (pbuffer , use_heap_large );
664
+ if ((dataw .dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT ) &&
665
+ (dataw .dwReserved0 & ~IO_REPARSE_TAG_CLOUD_MASK ) == IO_REPARSE_TAG_CLOUD &&
666
+ EG (windows_version_info ).dwMajorVersion >= 10 &&
667
+ EG (windows_version_info ).dwMinorVersion == 0 &&
668
+ EG (windows_version_info ).dwBuildNumber >= 18362 &&
669
+ GetFileInformationByHandle (hLink , & fileInformation ) &&
670
+ !(fileInformation .dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT )) {
671
+ dataw .dwFileAttributes = fileInformation .dwFileAttributes ;
672
+ CloseHandle (hLink );
673
+ (* ll )-- ;
674
+ goto retry ;
675
+ }
659
676
free_alloca (tmp , use_heap );
660
677
CloseHandle (hLink );
661
678
FREE_PATHW ()
@@ -735,8 +752,7 @@ static size_t tsrm_realpath_r(char *path, size_t start, size_t len, int *ll, tim
735
752
}
736
753
else if (pbuffer -> ReparseTag == IO_REPARSE_TAG_DEDUP ||
737
754
/* Starting with 1709. */
738
- (pbuffer -> ReparseTag & IO_REPARSE_TAG_CLOUD_MASK ) != 0 && 0x90001018L != pbuffer -> ReparseTag ||
739
- IO_REPARSE_TAG_CLOUD == pbuffer -> ReparseTag ||
755
+ (pbuffer -> ReparseTag & ~IO_REPARSE_TAG_CLOUD_MASK ) == IO_REPARSE_TAG_CLOUD ||
740
756
IO_REPARSE_TAG_ONEDRIVE == pbuffer -> ReparseTag ) {
741
757
isabsolute = 1 ;
742
758
substitutename = malloc ((len + 1 ) * sizeof (char ));
0 commit comments