Rebase against 1a7b256f7c69c50c2a216317e03f9caeb268d0af.

This commit is contained in:
Zebediah Figura
2020-09-23 17:31:14 -05:00
parent 22ed5ee061
commit 5087d8a8d9
15 changed files with 131 additions and 446 deletions

View File

@@ -1,4 +1,4 @@
From 1703abc6afb86f5427ba73bcf6384bdea6d0eb69 Mon Sep 17 00:00:00 2001
From 3ed31bd914d853f6e4b550db7ff0c68ab8918dad 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
@@ -15,10 +15,10 @@ Subject: [PATCH] ntdll: Setup a temporary signal handler during process
7 files changed, 74 insertions(+), 1 deletion(-)
diff --git a/dlls/ntdll/unix/loader.c b/dlls/ntdll/unix/loader.c
index 6f25f4ae87e..f9a26e6a531 100644
index e7a7c96a974..0ffbab757a3 100644
--- a/dlls/ntdll/unix/loader.c
+++ b/dlls/ntdll/unix/loader.c
@@ -1657,6 +1657,7 @@ void __wine_main( int argc, char *argv[], char *envp[] )
@@ -1785,6 +1785,7 @@ void __wine_main( int argc, char *argv[], char *envp[] )
#endif
virtual_init();
@@ -27,10 +27,10 @@ index 6f25f4ae87e..f9a26e6a531 100644
init_environment( argc, argv, envp );
diff --git a/dlls/ntdll/unix/signal_arm.c b/dlls/ntdll/unix/signal_arm.c
index 89baf6db3df..f5c683ec4e1 100644
index e8971d22dbd..ca291456284 100644
--- a/dlls/ntdll/unix/signal_arm.c
+++ b/dlls/ntdll/unix/signal_arm.c
@@ -979,6 +979,12 @@ void signal_init_process(void)
@@ -977,6 +977,12 @@ void signal_init_process(void)
exit(1);
}
@@ -44,10 +44,10 @@ index 89baf6db3df..f5c683ec4e1 100644
/***********************************************************************
* init_thread_context
diff --git a/dlls/ntdll/unix/signal_arm64.c b/dlls/ntdll/unix/signal_arm64.c
index cfe1c75b59f..c599ce8d308 100644
index e08d6a2ee17..025fa63316a 100644
--- a/dlls/ntdll/unix/signal_arm64.c
+++ b/dlls/ntdll/unix/signal_arm64.c
@@ -1074,6 +1074,13 @@ void signal_init_process(void)
@@ -1070,6 +1070,13 @@ void signal_init_process(void)
exit(1);
}
@@ -62,10 +62,10 @@ index cfe1c75b59f..c599ce8d308 100644
* init_thread_context
*/
diff --git a/dlls/ntdll/unix/signal_i386.c b/dlls/ntdll/unix/signal_i386.c
index 5d4d1469472..73216888dd9 100644
index e0ba27d3e94..dd9c8e255cc 100644
--- a/dlls/ntdll/unix/signal_i386.c
+++ b/dlls/ntdll/unix/signal_i386.c
@@ -1809,6 +1809,30 @@ static BOOL handle_syscall_fault( ucontext_t *sigcontext, void *stack_ptr,
@@ -1865,6 +1865,30 @@ static BOOL handle_syscall_fault( ucontext_t *sigcontext, void *stack_ptr,
}
@@ -96,7 +96,7 @@ index 5d4d1469472..73216888dd9 100644
/**********************************************************************
* segv_handler
*
@@ -2368,6 +2392,34 @@ void signal_init_process(void)
@@ -2424,6 +2448,34 @@ void signal_init_process(void)
exit(1);
}
@@ -132,10 +132,10 @@ index 5d4d1469472..73216888dd9 100644
/***********************************************************************
* init_thread_context
diff --git a/dlls/ntdll/unix/signal_x86_64.c b/dlls/ntdll/unix/signal_x86_64.c
index c74b8be32b8..d28b7cce8ee 100644
index e11b2c70b59..1b45ca246d3 100644
--- a/dlls/ntdll/unix/signal_x86_64.c
+++ b/dlls/ntdll/unix/signal_x86_64.c
@@ -2627,6 +2627,12 @@ void signal_init_process(void)
@@ -2680,6 +2680,12 @@ void signal_init_process(void)
exit(1);
}
@@ -149,10 +149,10 @@ index c74b8be32b8..d28b7cce8ee 100644
/***********************************************************************
* init_thread_context
diff --git a/dlls/ntdll/unix/unix_private.h b/dlls/ntdll/unix/unix_private.h
index ce3c14d2594..44a2b5712f5 100644
index 3d9dca3c51d..7b541dc6a31 100644
--- a/dlls/ntdll/unix/unix_private.h
+++ b/dlls/ntdll/unix/unix_private.h
@@ -217,6 +217,7 @@ extern NTSTATUS signal_alloc_thread( TEB *teb ) DECLSPEC_HIDDEN;
@@ -215,6 +215,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;
@@ -161,12 +161,12 @@ index ce3c14d2594..44a2b5712f5 100644
BOOL suspend, void *thunk, TEB *teb ) DECLSPEC_HIDDEN;
extern void DECLSPEC_NORETURN signal_exit_thread( int status, void (*func)(int) ) DECLSPEC_HIDDEN;
diff --git a/dlls/ntdll/unix/virtual.c b/dlls/ntdll/unix/virtual.c
index 58c84caab5f..ad2f959d61c 100644
index 94b3975a964..cf0c1598720 100644
--- a/dlls/ntdll/unix/virtual.c
+++ b/dlls/ntdll/unix/virtual.c
@@ -2886,7 +2886,7 @@ NTSTATUS virtual_handle_fault( void *addr, DWORD err, void *stack )
@@ -2967,7 +2967,7 @@ NTSTATUS virtual_handle_fault( void *addr, DWORD err, void *stack )
pthread_mutex_lock( &virtual_mutex ); /* no need for signal masking inside signal handler */
mutex_lock( &virtual_mutex ); /* no need for signal masking inside signal handler */
vprot = get_page_vprot( page );
- if (!is_inside_signal_stack( stack ) && (vprot & VPROT_GUARD))
+ if (stack && !is_inside_signal_stack( stack ) && (vprot & VPROT_GUARD))

View File

@@ -1,4 +1,4 @@
From c8020cc027be026da2aef0ed866a59629d4e053e Mon Sep 17 00:00:00 2001
From 4a297f731112822e51086826f975bf5db9178e52 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 563ed01deb5..79f6af38b00 100644
index cf0c1598720..ff585c647bc 100644
--- a/dlls/ntdll/unix/virtual.c
+++ b/dlls/ntdll/unix/virtual.c
@@ -490,6 +490,21 @@ static void reserve_area( void *addr, void *end )
@@ -495,6 +495,21 @@ static void reserve_area( void *addr, void *end )
#endif /* __APPLE__ */
}
@@ -34,7 +34,7 @@ index 563ed01deb5..79f6af38b00 100644
static void mmap_init( const struct preload_info *preload_info )
{
@@ -847,8 +862,19 @@ static int get_unix_prot( BYTE vprot )
@@ -852,8 +867,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 563ed01deb5..79f6af38b00 100644
if (vprot & VPROT_WRITEWATCH) prot &= ~PROT_WRITE;
}
if (!prot) prot = PROT_NONE;
@@ -1577,7 +1603,7 @@ static void update_write_watches( void *base, size_t size, size_t accessed_size
@@ -1457,7 +1483,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 563ed01deb5..79f6af38b00 100644
/* restore page protections on the entire range */
mprotect_range( base, size, 0, 0 );
}
@@ -2919,12 +2945,13 @@ NTSTATUS virtual_handle_fault( void *addr, DWORD err, void *stack )
@@ -2985,12 +3011,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 563ed01deb5..79f6af38b00 100644
+ /* ignore fault if page is writable now */
+ if (get_unix_prot( get_page_vprot( page ) ) & PROT_WRITE) ret = STATUS_SUCCESS;
}
pthread_mutex_unlock( &virtual_mutex );
mutex_unlock( &virtual_mutex );
return ret;
@@ -3001,11 +3028,16 @@ static NTSTATUS check_write_access( void *base, size_t size, BOOL *has_write_wat
@@ -3067,11 +3094,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;