aboutsummaryrefslogtreecommitdiffstats
path: root/arch/um
diff options
context:
space:
mode:
authorEric W. Biederman <ebiederm@xmission.com>2018-04-17 16:26:37 -0400
committerEric W. Biederman <ebiederm@xmission.com>2018-04-25 11:40:51 -0400
commit3eb0f5193b497083391aa05d35210d5645211eef (patch)
tree65f009d4cdd5e407741a4431c0aacd40452779bd /arch/um
parentf6ed1ecad56fec7ab5c6bf741064b95801e9688f (diff)
signal: Ensure every siginfo we send has all bits initialized
Call clear_siginfo to ensure every stack allocated siginfo is properly initialized before being passed to the signal sending functions. Note: It is not safe to depend on C initializers to initialize struct siginfo on the stack because C is allowed to skip holes when initializing a structure. The initialization of struct siginfo in tracehook_report_syscall_exit was moved from the helper user_single_step_siginfo into tracehook_report_syscall_exit itself, to make it clear that the local variable siginfo gets fully initialized. In a few cases the scope of struct siginfo has been reduced to make it clear that siginfo siginfo is not used on other paths in the function in which it is declared. Instances of using memset to initialize siginfo have been replaced with calls clear_siginfo for clarity. Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
Diffstat (limited to 'arch/um')
-rw-r--r--arch/um/kernel/trap.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/arch/um/kernel/trap.c b/arch/um/kernel/trap.c
index b2b02df9896e..d4d38520c4c6 100644
--- a/arch/um/kernel/trap.c
+++ b/arch/um/kernel/trap.c
@@ -164,6 +164,7 @@ static void bad_segv(struct faultinfo fi, unsigned long ip)
164{ 164{
165 struct siginfo si; 165 struct siginfo si;
166 166
167 clear_siginfo(&si);
167 si.si_signo = SIGSEGV; 168 si.si_signo = SIGSEGV;
168 si.si_code = SEGV_ACCERR; 169 si.si_code = SEGV_ACCERR;
169 si.si_addr = (void __user *) FAULT_ADDRESS(fi); 170 si.si_addr = (void __user *) FAULT_ADDRESS(fi);
@@ -220,6 +221,7 @@ unsigned long segv(struct faultinfo fi, unsigned long ip, int is_user,
220 int is_write = FAULT_WRITE(fi); 221 int is_write = FAULT_WRITE(fi);
221 unsigned long address = FAULT_ADDRESS(fi); 222 unsigned long address = FAULT_ADDRESS(fi);
222 223
224 clear_siginfo(&si);
223 if (!is_user && regs) 225 if (!is_user && regs)
224 current->thread.segv_regs = container_of(regs, struct pt_regs, regs); 226 current->thread.segv_regs = container_of(regs, struct pt_regs, regs);
225 227