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-WRITE...
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.
- 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.
Thanks, Piotr