[PATCH 2/2 v2] ntdll: Track copy-on-write memory state on i386 and x86_64 architectures.
Sebastian Lackner
sebastian at fds-team.de
Fri Feb 22 13:24:36 CST 2019
Hello Piotr,
On 22.02.19 17:38, Piotr Caban wrote:
> Hi Sebastian,
>
> On 2/22/19 5:08 PM, Sebastian Lackner wrote:
>> I didn't fully review your patch, but note that we had this feature
>> basically disabled in Staging (hidden behind an environment variable)
>> because it caused a lot of trouble.
>>
>> The main issues were:
>>
>> * Syscalls will just fail with EFAULT when they encounter a page
>> without sufficient protections. It will not trigger a signal! This
>> means it would be necessary to add code to handle EFAULT whenever
>> there is a chance that the memory passed by the user might have the
>> copy-on-write flag. In particular, this affects all wineserver calls
>> which directly write to user-provided buffers. See:
>>
>> https://github.com/wine-staging/wine-staging/blob/master/patches/ntdll-WRITECOPY/0001-ntdll-Trigger-write-watches-before-passing-userdata-.patch
>>
> The code is changed in a way so it behaves exactly the same as memory
> with write watch. Before executing the syscall check_write_access should
> make the memory readable. I think copy-on-write EFAULT shouldn't happen
> during syscall in current wine.
When check_write_access() is called everything should be fine, but it
doesn't look like it is used everywhere. What about all the NtQuery*()
functions that pass through user-provided pointers? See for example
NtQueryInformationAtom or RtlQueryAtomInAtomTable - both directly pass
an untrusted pointer to wine_server_set_reply() and both use
wine_server_call() instead of any of the locked variants. Also, there
still seems to be at least one plain read() call in advapi32:
https://github.com/wine-staging/wine-staging/blob/master/patches/ntdll-WRITECOPY/0002-advapi-Trigger-write-watches-before-passing-userdata.patch
>
>> * For third party libraries you always have to ensure that faults are
>> handled before passing any pointer. This even affects the OpenGL libs:
>> They pass memory addresses directly to the kernel, and thus don't
>> trigger the write patches. We noticed weird rendering errors in
>> several games with the copy-on-write logic enabled.
> Do you remember any of the games that were affected? I'm expecting it to
> still be a problem.
Unfortunately I am not sure anymore which game showed the graphic
issues, but I would suspect that even a simple OpenGL sample code to
download a texture into WRITECOPY memory would be affected. There were
at least two bug reports related to WRITECOPY regressions though:
* https://bugs.winehq.org/show_bug.cgi?id=39349
* https://bugs.winehq.org/show_bug.cgi?id=39350
For the second one the app has probably changed in the meantime, but
maybe the first one can still be used to reproduce one of the issues.
Best regards,
Sebastian
More information about the wine-devel
mailing list