[PATCH] D58513: [libFuzzer][Windows] Port fork mode to Windows
Zachary Turner via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Feb 21 09:06:03 PST 2019
zturner added inline comments.
================
Comment at: compiler-rt/lib/fuzzer/FuzzerIOWindows.cpp:82-83
+ // is very slow on Windows.
+ return (FileAttributes &
+ (FILE_ATTRIBUTE_REPARSE_POINT | FILE_ATTRIBUTE_DIRECTORY)) == 0;
+}
----------------
I mentioned this elsewhere, but reparse point does not imply that the target of the reparse point is a file. It could be a directory junction, or something else entirely. Here's all the known reparse tags:
```
#define IO_REPARSE_TAG_MOUNT_POINT (0xA0000003L)
#define IO_REPARSE_TAG_HSM (0xC0000004L)
#define IO_REPARSE_TAG_HSM2 (0x80000006L)
#define IO_REPARSE_TAG_SIS (0x80000007L)
#define IO_REPARSE_TAG_WIM (0x80000008L)
#define IO_REPARSE_TAG_CSV (0x80000009L)
#define IO_REPARSE_TAG_DFS (0x8000000AL)
#define IO_REPARSE_TAG_SYMLINK (0xA000000CL)
#define IO_REPARSE_TAG_DFSR (0x80000012L)
#define IO_REPARSE_TAG_DEDUP (0x80000013L)
#define IO_REPARSE_TAG_NFS (0x80000014L)
#define IO_REPARSE_TAG_FILE_PLACEHOLDER (0x80000015L)
#define IO_REPARSE_TAG_WOF (0x80000017L)
#define IO_REPARSE_TAG_WCI (0x80000018L)
#define IO_REPARSE_TAG_WCI_1 (0x90001018L)
#define IO_REPARSE_TAG_GLOBAL_REPARSE (0xA0000019L)
#define IO_REPARSE_TAG_CLOUD (0x9000001AL)
#define IO_REPARSE_TAG_CLOUD_1 (0x9000101AL)
#define IO_REPARSE_TAG_CLOUD_2 (0x9000201AL)
#define IO_REPARSE_TAG_CLOUD_3 (0x9000301AL)
#define IO_REPARSE_TAG_CLOUD_4 (0x9000401AL)
#define IO_REPARSE_TAG_CLOUD_5 (0x9000501AL)
#define IO_REPARSE_TAG_CLOUD_6 (0x9000601AL)
#define IO_REPARSE_TAG_CLOUD_7 (0x9000701AL)
#define IO_REPARSE_TAG_CLOUD_8 (0x9000801AL)
#define IO_REPARSE_TAG_CLOUD_9 (0x9000901AL)
#define IO_REPARSE_TAG_CLOUD_A (0x9000A01AL)
#define IO_REPARSE_TAG_CLOUD_B (0x9000B01AL)
#define IO_REPARSE_TAG_CLOUD_C (0x9000C01AL)
#define IO_REPARSE_TAG_CLOUD_D (0x9000D01AL)
#define IO_REPARSE_TAG_CLOUD_E (0x9000E01AL)
#define IO_REPARSE_TAG_CLOUD_F (0x9000F01AL)
#define IO_REPARSE_TAG_CLOUD_MASK (0x0000F000L)
#define IO_REPARSE_TAG_APPEXECLINK (0x8000001BL)
#define IO_REPARSE_TAG_PROJFS (0x9000001CL)
#define IO_REPARSE_TAG_STORAGE_SYNC (0x8000001EL)
#define IO_REPARSE_TAG_WCI_TOMBSTONE (0xA000001FL)
#define IO_REPARSE_TAG_UNHANDLED (0x80000020L)
#define IO_REPARSE_TAG_ONEDRIVE (0x80000021L)
#define IO_REPARSE_TAG_PROJFS_TOMBSTONE (0xA0000022L)
#define IO_REPARSE_TAG_AF_UNIX (0x80000023L)
```
================
Comment at: compiler-rt/lib/fuzzer/FuzzerIOWindows.cpp:212
+ continue;
+ IterateDirRecursive(Path, DirPreCallback, DirPostCallback, FileCallback);
+ } else if (IsFile(PathAttrs) || IsLink(PathAttrs)) {
----------------
Note that this will not follow directory symlinks or junctions. Is that the desired behavior?
================
Comment at: compiler-rt/lib/fuzzer/FuzzerIOWindows.cpp:213
+ IterateDirRecursive(Path, DirPreCallback, DirPostCallback, FileCallback);
+ } else if (IsFile(PathAttrs) || IsLink(PathAttrs)) {
+ FileCallback(Path);
----------------
This doesn't look correct to me. You can have a reparse point to something that itself isn't a file. If it's a link, I think you need to check the reparse tag in `FindInfo.dwReserved0` as described [[ https://docs.microsoft.com/en-us/windows/desktop/api/minwinbase/ns-minwinbase-_win32_find_dataa | here ]]
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D58513/new/
https://reviews.llvm.org/D58513
More information about the llvm-commits
mailing list