https://bugs.winehq.org/show_bug.cgi?id=47100
--- Comment #3 from Erich E. Hoover erich.e.hoover@gmail.com --- (In reply to Louis Lenders from comment #2)
I'm looking into a possibly related issue at the moment, does it work if the >destination exists?
Do you mean like below? It makes a difference apparently but it looks weird to me: File: foo -> .///././/////////////////////////.//.//bar ...
Yes, that is exactly what I mean. It looks like I made a mistake in validating the destination path and am currently requiring it to exist before it will make a symlink/junction point. If you wouldn't mind testing, you should be able to fix it by replacing this line in FILE_CreateSymlink (dlls/ntdll/file.c): if ((status = wine_nt_to_unix_file_name( &nt_dest, &unix_dest, FILE_OPEN, FALSE ))) with these two: status = wine_nt_to_unix_file_name( &nt_dest, &unix_dest, 0, FALSE ); if (status != STATUS_SUCCESS && status != STATUS_NO_SUCH_FILE)
The reason it looks "weird" is that it is encoding the Reparse Tag into the symlink as "binary" (no period = 0, period = 1). This allows us to tell the difference between a Junction Point (IO_REPARSE_TAG_MOUNT_POINT) and an NT Symlink (IO_REPARSE_TAG_SYMLINK). This wouldn't matter so much if the format of the returned data was the same, but the two reparse types return incompatible structures.