[Bug 50036] Remaining issues in Bugs in ntdll-Junction_Points in staging

WineHQ Bugzilla wine-bugs at winehq.org
Sun Nov 22 00:19:32 CST 2020


https://bugs.winehq.org/show_bug.cgi?id=50036

--- Comment #10 from Erich E. Hoover <erich.e.hoover at gmail.com> ---
Created attachment 68679
  --> https://bugs.winehq.org/attachment.cgi?id=68679
Open a reparse point, but ignore it if the reparse tag is 'WINE'

(In reply to Zebediah Figura from comment #7)
> ...
> It's worth pointing out that we really could use tests for what happens when
> you call various file functions with FILE_FLAG_OPEN_REPARSE_POINT. The trick
> is that we need to make sure that even if a system32 file is opened
> therewith, all operations should treat it as if it wasn't.

I actually have a small number of tests for this flag already with some todos. 
But anyway, as a quick proof of concept I've attached a patch (requires the
staging patches) that shows how this can be done*.  This is not a full
implementation, just demonstrating that FILE_FLAG_OPEN_REPARSE can be used to
open regular reparse points and still ignore "special" ones.  The key bit goes
into server/fd.c (along with minor changes to decode_symlink):
===
    if ((options & FILE_OPEN_REPARSE_POINT) && !(flags & O_CREAT))
    {
        ULONG reparse_tag = 0;

        decode_symlink( name, &reparse_tag, NULL);
        if (reparse_tag != *(uint32_t *)"WINE" )
            flags |= O_SYMLINK;
    }
===
If I can make some time I'll try to put together a proper implementation so
that I can test having system dll symlinks with a real prefix.

* This is rather hacky (futimens has issues with symlinks, so a very basic
utimensat call is thrown in its place) and it also includes a fix for
converting signed 32-bit time_t ( https://source.winehq.org/patches/data/196350
) to fix some test issues.

-- 
Do not reply to this email, post in Bugzilla using the
above URL to reply.
You are receiving this mail because:
You are watching all bug changes.



More information about the wine-bugs mailing list