|
45 | 45 | # define IO_REPARSE_TAG_DEDUP 0x80000013
|
46 | 46 | # endif
|
47 | 47 |
|
| 48 | +# ifndef IO_REPARSE_TAG_CLOUD |
| 49 | +# define IO_REPARSE_TAG_CLOUD (0x9000001AL) |
| 50 | +# endif |
| 51 | +/* IO_REPARSE_TAG_CLOUD_1 through IO_REPARSE_TAG_CLOUD_F have values of 0x9000101AL |
| 52 | + to 0x9000F01AL, they can be checked against the mask. */ |
| 53 | +#ifndef IO_REPARSE_TAG_CLOUD_MASK |
| 54 | +#define IO_REPARSE_TAG_CLOUD_MASK (0x0000F000L) |
| 55 | +#endif |
| 56 | + |
| 57 | +#ifndef IO_REPARSE_TAG_ONEDRIVE |
| 58 | +#define IO_REPARSE_TAG_ONEDRIVE (0x80000021L) |
| 59 | +#endif |
| 60 | + |
48 | 61 | # ifndef VOLUME_NAME_NT
|
49 | 62 | # define VOLUME_NAME_NT 0x2
|
50 | 63 | # endif
|
@@ -936,7 +949,7 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i
|
936 | 949 | return -1;
|
937 | 950 | }
|
938 | 951 |
|
939 |
| - hLink = CreateFileW(pathw, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_FLAG_OPEN_REPARSE_POINT|FILE_FLAG_BACKUP_SEMANTICS, NULL); |
| 952 | + hLink = CreateFileW(pathw, 0, 0, NULL, OPEN_EXISTING, FILE_FLAG_OPEN_REPARSE_POINT|FILE_FLAG_BACKUP_SEMANTICS, NULL); |
940 | 953 | if(hLink == INVALID_HANDLE_VALUE) {
|
941 | 954 | free_alloca(tmp, use_heap);
|
942 | 955 | FREE_PATHW()
|
@@ -1029,7 +1042,11 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i
|
1029 | 1042 | return -1;
|
1030 | 1043 | }
|
1031 | 1044 | }
|
1032 |
| - else if (pbuffer->ReparseTag == IO_REPARSE_TAG_DEDUP) { |
| 1045 | + else if (pbuffer->ReparseTag == IO_REPARSE_TAG_DEDUP || |
| 1046 | + /* Starting with 1709. */ |
| 1047 | + (pbuffer->ReparseTag & IO_REPARSE_TAG_CLOUD_MASK) != 0 && 0x90001018L != pbuffer->ReparseTag || |
| 1048 | + IO_REPARSE_TAG_CLOUD == pbuffer->ReparseTag || |
| 1049 | + IO_REPARSE_TAG_ONEDRIVE == pbuffer->ReparseTag) { |
1033 | 1050 | isabsolute = 1;
|
1034 | 1051 | substitutename = malloc((len + 1) * sizeof(char));
|
1035 | 1052 | if (!substitutename) {
|
|
0 commit comments