]> granicus.if.org Git - php/commitdiff
Fixed #75384 PHP seems incompatible with OneDrive files on demand
authorAnatol Belski <ab@php.net>
Wed, 8 Nov 2017 10:52:42 +0000 (11:52 +0100)
committerAnatol Belski <ab@php.net>
Wed, 8 Nov 2017 10:52:42 +0000 (11:52 +0100)
Zend/zend_virtual_cwd.c

index 8009f2f3fdd733e425de35d42ff5f775850695ba..b6b798eacaf442599ffdc59a82f05a8d9a4f2e94 100644 (file)
 #  define IO_REPARSE_TAG_DEDUP   0x80000013
 # endif
 
+# ifndef IO_REPARSE_TAG_CLOUD
+#  define IO_REPARSE_TAG_CLOUD    (0x9000001AL)
+# endif
+/* IO_REPARSE_TAG_CLOUD_1 through IO_REPARSE_TAG_CLOUD_F have values of 0x9000101AL
+   to 0x9000F01AL, they can be checked against the mask. */
+#ifndef IO_REPARSE_TAG_CLOUD_MASK
+#define IO_REPARSE_TAG_CLOUD_MASK (0x0000F000L)
+#endif
+
+#ifndef IO_REPARSE_TAG_ONEDRIVE
+#define IO_REPARSE_TAG_ONEDRIVE   (0x80000021L)
+#endif
+
 # ifndef VOLUME_NAME_NT
 #  define VOLUME_NAME_NT 0x2
 # endif
@@ -908,7 +921,7 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i
                                return -1;
                        }
 
-                       hLink = CreateFile(path, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_FLAG_OPEN_REPARSE_POINT|FILE_FLAG_BACKUP_SEMANTICS, NULL);
+                       hLink = CreateFile(path, 0, 0, NULL, OPEN_EXISTING, FILE_FLAG_OPEN_REPARSE_POINT|FILE_FLAG_BACKUP_SEMANTICS, NULL);
                        if(hLink == INVALID_HANDLE_VALUE) {
                                return -1;
                        }
@@ -977,7 +990,11 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i
                                };
                                substitutename[substitutename_len] = 0;
                        }
-                       else if (pbuffer->ReparseTag == IO_REPARSE_TAG_DEDUP) {
+                       else if (pbuffer->ReparseTag == IO_REPARSE_TAG_DEDUP ||
+                                       /* Starting with 1709. */
+                                       (pbuffer->ReparseTag & IO_REPARSE_TAG_CLOUD_MASK) != 0 && 0x90001018L != pbuffer->ReparseTag ||
+                                       IO_REPARSE_TAG_CLOUD == pbuffer->ReparseTag ||
+                                       IO_REPARSE_TAG_ONEDRIVE == pbuffer->ReparseTag) {
                                isabsolute = 1;
                                memcpy(substitutename, path, len + 1);
                                substitutename_len = len;