@@ -848,9 +848,13 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i
848
848
int bufindex = 0 , isabsolute = 0 ;
849
849
wchar_t * reparsetarget ;
850
850
BOOL isVolume = FALSE;
851
- char * printname = NULL , * substitutename = NULL ;
851
+ #if VIRTUAL_CWD_DEBUG
852
+ char * printname = NULL ;
853
+ #endif
854
+ char * substitutename = NULL ;
852
855
size_t substitutename_len ;
853
856
int substitutename_off = 0 ;
857
+ wchar_t tmpsubstname [MAXPATHLEN ];
854
858
855
859
if (++ (* ll ) > LINK_MAX ) {
856
860
free_alloca (tmp , use_heap );
@@ -885,44 +889,66 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i
885
889
if (pbuffer -> ReparseTag == IO_REPARSE_TAG_SYMLINK ) {
886
890
reparsetarget = pbuffer -> SymbolicLinkReparseBuffer .ReparseTarget ;
887
891
isabsolute = (pbuffer -> SymbolicLinkReparseBuffer .Flags == 0 ) ? 1 : 0 ;
892
+ #if VIRTUAL_CWD_DEBUG
888
893
printname = php_win32_ioutil_w_to_any (reparsetarget + pbuffer -> MountPointReparseBuffer .PrintNameOffset / sizeof (WCHAR ));
889
894
if (!printname ) {
890
895
free_alloca (pbuffer , use_heap_large );
891
896
free_alloca (tmp , use_heap );
892
897
FREE_PATHW ()
893
898
return -1 ;
894
899
}
900
+ #endif
895
901
896
902
substitutename_len = pbuffer -> MountPointReparseBuffer .SubstituteNameLength / sizeof (WCHAR );
897
- substitutename = php_win32_cp_conv_w_to_any (reparsetarget + pbuffer -> MountPointReparseBuffer .SubstituteNameOffset / sizeof (WCHAR ),
898
- substitutename_len , & substitutename_len );
903
+ if (substitutename_len > MAXPATHLEN ) {
904
+ free_alloca (pbuffer , use_heap_large );
905
+ free_alloca (tmp , use_heap );
906
+ FREE_PATHW ()
907
+ return -1 ;
908
+ }
909
+ memmove (tmpsubstname , reparsetarget + pbuffer -> MountPointReparseBuffer .SubstituteNameOffset / sizeof (WCHAR ), pbuffer -> MountPointReparseBuffer .SubstituteNameLength );
910
+ tmpsubstname [substitutename_len ] = L'\0' ;
911
+ substitutename = php_win32_cp_conv_w_to_any (tmpsubstname , substitutename_len , & substitutename_len );
899
912
if (!substitutename ) {
900
913
free_alloca (pbuffer , use_heap_large );
901
914
free_alloca (tmp , use_heap );
915
+ #if VIRTUAL_CWD_DEBUG
902
916
free (printname );
917
+ #endif
903
918
FREE_PATHW ()
904
919
return -1 ;
905
920
}
906
921
}
907
922
else if (pbuffer -> ReparseTag == IO_REPARSE_TAG_MOUNT_POINT ) {
908
923
isabsolute = 1 ;
909
924
reparsetarget = pbuffer -> MountPointReparseBuffer .ReparseTarget ;
925
+ #if VIRTUAL_CWD_DEBUG
910
926
printname = php_win32_ioutil_w_to_any (reparsetarget + pbuffer -> MountPointReparseBuffer .PrintNameOffset / sizeof (WCHAR ));
911
927
if (!printname ) {
912
928
free_alloca (pbuffer , use_heap_large );
913
929
free_alloca (tmp , use_heap );
914
930
FREE_PATHW ()
915
931
return -1 ;
916
932
}
933
+ #endif
917
934
918
935
919
936
substitutename_len = pbuffer -> MountPointReparseBuffer .SubstituteNameLength / sizeof (WCHAR );
920
- substitutename = php_win32_cp_conv_w_to_any (reparsetarget + pbuffer -> MountPointReparseBuffer .SubstituteNameOffset / sizeof (WCHAR ),
921
- substitutename_len , & substitutename_len );
937
+ if (substitutename_len > MAXPATHLEN ) {
938
+ free_alloca (pbuffer , use_heap_large );
939
+ free_alloca (tmp , use_heap );
940
+ FREE_PATHW ()
941
+ return -1 ;
942
+ }
943
+ memmove (tmpsubstname , reparsetarget + pbuffer -> MountPointReparseBuffer .SubstituteNameOffset / sizeof (WCHAR ), pbuffer -> MountPointReparseBuffer .SubstituteNameLength );
944
+ tmpsubstname [substitutename_len ] = L'\0' ;
945
+ substitutename = php_win32_cp_conv_w_to_any (tmpsubstname , substitutename_len , & substitutename_len );
922
946
if (!substitutename ) {
923
947
free_alloca (pbuffer , use_heap_large );
924
948
free_alloca (tmp , use_heap );
949
+ #if VIRTUAL_CWD_DEBUG
925
950
free (printname );
951
+ #endif
926
952
FREE_PATHW ()
927
953
return -1 ;
928
954
}
@@ -985,9 +1011,9 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i
985
1011
fprintf (stderr , "reparse: print: %s " , printname );
986
1012
fprintf (stderr , "sub: %s " , substitutename );
987
1013
fprintf (stderr , "resolved: %s " , path );
1014
+ free (printname );
988
1015
#endif
989
1016
free_alloca (pbuffer , use_heap_large );
990
- free (printname );
991
1017
free (substitutename );
992
1018
993
1019
if (isabsolute == 1 ) {
0 commit comments