diff --git a/dlls/ntdll/unix/virtual.c b/dlls/ntdll/unix/virtual.c index 964ce7bcf68..94d48c0fb47 100644 --- a/dlls/ntdll/unix/virtual.c +++ b/dlls/ntdll/unix/virtual.c @@ -4578,6 +4578,17 @@ NTSTATUS virtual_handle_fault( EXCEPTION_RECORD *rec, void *stack ) WARN( "treating read fault in a readable page as a write fault, addr %p\n", addr ); err = EXCEPTION_WRITE_FAULT; } + + /* CW Hack 24945 */ + if (err == EXCEPTION_WRITE_FAULT && + ((get_unix_prot( vprot ) & (PROT_WRITE | PROT_EXEC)) == (PROT_WRITE | PROT_EXEC))) + { + FIXME( "HACK: write fault on a w|x page, addr %p\n", addr ); + mprotect_range( page, page_size, 0, VPROT_EXEC ); + mprotect_range( page, page_size, VPROT_EXEC, 0 ); + ret = STATUS_SUCCESS; + goto done; + } #endif if (!is_inside_signal_stack( stack ) && (vprot & VPROT_GUARD)) @@ -4614,6 +4625,10 @@ NTSTATUS virtual_handle_fault( EXCEPTION_RECORD *rec, void *stack ) ret = STATUS_SUCCESS; } } + +#ifdef __APPLE__ +done: +#endif mutex_unlock( &virtual_mutex ); rec->ExceptionCode = ret; return ret;