Rebase against 42cb7d2ad1caba08de235e6319b9967296b5d554.

This commit is contained in:
Alistair Leslie-Hughes
2020-07-16 08:18:59 +10:00
parent 884f646404
commit c3c5d48b18
9 changed files with 73 additions and 69 deletions

View File

@@ -1,4 +1,4 @@
From 2efee8f30caa027977f7cfb91a84b748a5fd17cd Mon Sep 17 00:00:00 2001
From 25022d43f705d40658bb1aaf3ad8e86edf8b3325 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Michael=20M=C3=BCller?= <michael@fds-team.de>
Date: Sat, 4 Oct 2014 02:53:22 +0200
Subject: [PATCH] ntdll: Setup a temporary signal handler during process
@@ -8,16 +8,16 @@ Subject: [PATCH] ntdll: Setup a temporary signal handler during process
dlls/ntdll/unix/loader.c | 1 +
dlls/ntdll/unix/signal_arm.c | 6 ++++
dlls/ntdll/unix/signal_arm64.c | 7 +++++
dlls/ntdll/unix/signal_i386.c | 52 +++++++++++++++++++++++++++++++++
dlls/ntdll/unix/signal_i386.c | 56 +++++++++++++++++++++++++++++++++
dlls/ntdll/unix/signal_x86_64.c | 6 ++++
dlls/ntdll/unix/unix_private.h | 1 +
6 files changed, 73 insertions(+)
6 files changed, 77 insertions(+)
diff --git a/dlls/ntdll/unix/loader.c b/dlls/ntdll/unix/loader.c
index 73c24eff549..8881d073684 100644
index d03f5861d0..d7aa088e1d 100644
--- a/dlls/ntdll/unix/loader.c
+++ b/dlls/ntdll/unix/loader.c
@@ -1761,6 +1761,7 @@ void __wine_main( int argc, char *argv[], char *envp[] )
@@ -1812,6 +1812,7 @@ void __wine_main( int argc, char *argv[], char *envp[] )
#endif
virtual_init();
@@ -26,10 +26,10 @@ index 73c24eff549..8881d073684 100644
ntdll_module = load_ntdll();
fixup_ntdll_imports( &__wine_spec_nt_header );
diff --git a/dlls/ntdll/unix/signal_arm.c b/dlls/ntdll/unix/signal_arm.c
index e65b8a93d18..d7a9323a195 100644
index 34463309de..0810024a34 100644
--- a/dlls/ntdll/unix/signal_arm.c
+++ b/dlls/ntdll/unix/signal_arm.c
@@ -869,6 +869,12 @@ void signal_init_process(void)
@@ -830,6 +830,12 @@ void signal_init_process(void)
exit(1);
}
@@ -43,10 +43,10 @@ index e65b8a93d18..d7a9323a195 100644
/***********************************************************************
* init_thread_context
diff --git a/dlls/ntdll/unix/signal_arm64.c b/dlls/ntdll/unix/signal_arm64.c
index 7f8fb708ccd..574633dbd5d 100644
index e66952a29b..4b63de0ea4 100644
--- a/dlls/ntdll/unix/signal_arm64.c
+++ b/dlls/ntdll/unix/signal_arm64.c
@@ -791,6 +791,13 @@ void signal_init_process(void)
@@ -882,6 +882,13 @@ void signal_init_process(void)
exit(1);
}
@@ -61,10 +61,10 @@ index 7f8fb708ccd..574633dbd5d 100644
* init_thread_context
*/
diff --git a/dlls/ntdll/unix/signal_i386.c b/dlls/ntdll/unix/signal_i386.c
index 2f5d397ed55..c29a006736a 100644
index 162a0b6a70..dc66ed0f38 100644
--- a/dlls/ntdll/unix/signal_i386.c
+++ b/dlls/ntdll/unix/signal_i386.c
@@ -1644,6 +1644,30 @@ static BOOL handle_interrupt( unsigned int interrupt, ucontext_t *sigcontext, st
@@ -1590,6 +1590,34 @@ static BOOL handle_interrupt( unsigned int interrupt, ucontext_t *sigcontext, vo
}
@@ -76,17 +76,21 @@ index 2f5d397ed55..c29a006736a 100644
+ */
+static void segv_handler_early( int signal, siginfo_t *siginfo, void *sigcontext )
+{
+ ucontext_t *context = sigcontext;
+ EXCEPTION_RECORD rec = { 0 };
+ CONTEXT context;
+ ucontext_t *ucontext = sigcontext;
+ void *stack = setup_exception_record( sigcontext, &rec, &context );
+
+ init_handler( sigcontext );
+
+ switch (TRAP_sig(context))
+ switch (TRAP_sig(ucontext))
+ {
+ case TRAP_x86_PAGEFLT: /* Page fault */
+ if (!virtual_handle_fault( siginfo->si_addr, (ERROR_sig(context) >> 1) & 0x09, TRUE ))
+ if (!virtual_handle_fault( siginfo->si_addr, (ERROR_sig(ucontext) >> 1) & 0x09, stack ))
+ return;
+ /* fall-through */
+ default:
+ WINE_ERR( "Got unexpected trap %d during process initialization\n", TRAP_sig(context) );
+ WINE_ERR( "Got unexpected trap %d during process initialization\n", TRAP_sig(ucontext) );
+ abort_thread(1);
+ break;
+ }
@@ -95,7 +99,7 @@ index 2f5d397ed55..c29a006736a 100644
/**********************************************************************
* segv_handler
*
@@ -2243,6 +2267,34 @@ void signal_init_process(void)
@@ -2148,6 +2176,34 @@ void signal_init_process(void)
exit(1);
}
@@ -131,10 +135,10 @@ index 2f5d397ed55..c29a006736a 100644
/***********************************************************************
* init_thread_context
diff --git a/dlls/ntdll/unix/signal_x86_64.c b/dlls/ntdll/unix/signal_x86_64.c
index 88ee18461a2..dedc17bf60e 100644
index 01be0eab81..4342ab0237 100644
--- a/dlls/ntdll/unix/signal_x86_64.c
+++ b/dlls/ntdll/unix/signal_x86_64.c
@@ -1415,6 +1415,12 @@ void signal_init_process(void)
@@ -2409,6 +2409,12 @@ void signal_init_process(void)
exit(1);
}
@@ -148,10 +152,10 @@ index 88ee18461a2..dedc17bf60e 100644
/***********************************************************************
* init_thread_context
diff --git a/dlls/ntdll/unix/unix_private.h b/dlls/ntdll/unix/unix_private.h
index 7dbfde43b34..fbcd200c420 100644
index 3cf9ca6673..76c483cc3f 100644
--- a/dlls/ntdll/unix/unix_private.h
+++ b/dlls/ntdll/unix/unix_private.h
@@ -207,6 +207,7 @@ extern NTSTATUS signal_alloc_thread( TEB *teb ) DECLSPEC_HIDDEN;
@@ -218,6 +218,7 @@ extern NTSTATUS signal_alloc_thread( TEB *teb ) DECLSPEC_HIDDEN;
extern void signal_free_thread( TEB *teb ) DECLSPEC_HIDDEN;
extern void signal_init_thread( TEB *teb ) DECLSPEC_HIDDEN;
extern void signal_init_process(void) DECLSPEC_HIDDEN;

View File

@@ -1,4 +1,4 @@
From d85f01d0f447026a9cb266cd85934f6f0874ef75 Mon Sep 17 00:00:00 2001
From 7cdceba44d1eb2af5a724f55964802cd8bc05454 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Michael=20M=C3=BCller?= <michael@fds-team.de>
Date: Sat, 4 Oct 2014 03:22:09 +0200
Subject: [PATCH] ntdll: Properly handle PAGE_WRITECOPY protection. (try 5)
@@ -9,10 +9,10 @@ For now, only enable it when a special environment variable is set.
1 file changed, 39 insertions(+), 7 deletions(-)
diff --git a/dlls/ntdll/unix/virtual.c b/dlls/ntdll/unix/virtual.c
index 90dfb62eed1..b059261b3c0 100644
index b17d8d6b61e..d3ed89de62e 100644
--- a/dlls/ntdll/unix/virtual.c
+++ b/dlls/ntdll/unix/virtual.c
@@ -491,6 +491,21 @@ int CDECL mmap_enum_reserved_areas( int (CDECL *enum_func)(void *base, SIZE_T si
@@ -500,6 +500,21 @@ int CDECL mmap_enum_reserved_areas( int (CDECL *enum_func)(void *base, SIZE_T si
return ret;
}
@@ -34,7 +34,7 @@ index 90dfb62eed1..b059261b3c0 100644
/***********************************************************************
* free_ranges_lower_bound
@@ -792,8 +807,19 @@ static int get_unix_prot( BYTE vprot )
@@ -801,8 +816,19 @@ static int get_unix_prot( BYTE vprot )
{
if (vprot & VPROT_READ) prot |= PROT_READ;
if (vprot & VPROT_WRITE) prot |= PROT_WRITE | PROT_READ;
@@ -55,7 +55,7 @@ index 90dfb62eed1..b059261b3c0 100644
if (vprot & VPROT_WRITEWATCH) prot &= ~PROT_WRITE;
}
if (!prot) prot = PROT_NONE;
@@ -1532,7 +1558,7 @@ static void update_write_watches( void *base, size_t size, size_t accessed_size
@@ -1548,7 +1574,7 @@ static void update_write_watches( void *base, size_t size, size_t accessed_size
{
TRACE( "updating watch %p-%p-%p\n", base, (char *)base + accessed_size, (char *)base + size );
/* clear write watch flag on accessed pages */
@@ -64,7 +64,7 @@ index 90dfb62eed1..b059261b3c0 100644
/* restore page protections on the entire range */
mprotect_range( base, size, 0, 0 );
}
@@ -2854,12 +2880,13 @@ NTSTATUS virtual_handle_fault( LPCVOID addr, DWORD err, BOOL on_signal_stack )
@@ -2900,12 +2926,13 @@ NTSTATUS virtual_handle_fault( void *addr, DWORD err, void *stack )
set_page_vprot_bits( page, page_size, 0, VPROT_WRITEWATCH );
mprotect_range( page, page_size, 0, 0 );
}
@@ -80,9 +80,9 @@ index 90dfb62eed1..b059261b3c0 100644
+ /* ignore fault if page is writable now */
+ if (get_unix_prot( get_page_vprot( page ) ) & PROT_WRITE) ret = STATUS_SUCCESS;
}
server_leave_uninterrupted_section( &virtual_mutex, &sigset );
pthread_mutex_unlock( &virtual_mutex );
return ret;
@@ -2881,11 +2908,16 @@ static NTSTATUS check_write_access( void *base, size_t size, BOOL *has_write_wat
@@ -2982,11 +3009,16 @@ static NTSTATUS check_write_access( void *base, size_t size, BOOL *has_write_wat
{
BYTE vprot = get_page_vprot( addr + i );
if (vprot & VPROT_WRITEWATCH) *has_write_watch = TRUE;