From b461ad46c66c8dbe3302650df7be23d62ec8bdce Mon Sep 17 00:00:00 2001 From: Alan Cox Date: Sun, 21 Feb 2016 19:50:12 +0000 Subject: [PATCH] kernel: Fix breakages in revised exit handling This messed up the left and right halves of the return codes. --- Kernel/include/kernel.h | 3 ++- Kernel/include/level2.h | 2 +- Kernel/process.c | 8 ++++---- Kernel/syscall_proc.c | 2 +- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/Kernel/include/kernel.h b/Kernel/include/kernel.h index f5955af3..21f56dbc 100644 --- a/Kernel/include/kernel.h +++ b/Kernel/include/kernel.h @@ -47,7 +47,7 @@ From UZI by Doug Braun and UZI280 by Stefan Nitschke. (udata.u_ptab->p_uid == (p)->p_uid || super()) #define pathbuf() tmpbuf() #define pathfree(tb) brelse(tb) -#define dump_core(sig) +#define dump_core(sig) sig #endif @@ -476,6 +476,7 @@ struct s_argblk { #define WNOHANG 1 #define WUNTRACED 2 #define _WSTOPPED 0xFF +#define W_COREDUMP 0x80 /* Open() parameters. */ diff --git a/Kernel/include/level2.h b/Kernel/include/level2.h index 3aa77cf0..093a0e7f 100644 --- a/Kernel/include/level2.h +++ b/Kernel/include/level2.h @@ -61,7 +61,7 @@ extern arg_t _setsid(void); extern arg_t _getsid(void); /* Provided by the execve support */ -extern void write_core_image(void); +extern uint8_t write_core_image(void); /* This will change a lot in future ! */ struct coredump { diff --git a/Kernel/process.c b/Kernel/process.c index dec30727..0158d393 100644 --- a/Kernel/process.c +++ b/Kernel/process.c @@ -434,14 +434,15 @@ void sgrpsig(uint16_t pgrp, uint8_t sig) } #ifdef CONFIG_LEVEL_2 -static void dump_core(uint8_t sig) +static uint8_t dump_core(uint8_t sig) { if (!(udata.u_flags & U_FLAG_NOCORE) && ((sig == SIGQUIT || sig == SIGILL || sig == SIGTRAP || sig == SIGABRT || sig == SIGBUS || sig == SIGFPE || sig == SIGSEGV || sig == SIGXCPU || sig == SIGXFSZ || sig == SIGSYS))) { - write_core_image(); + return sig | write_core_image(); } + return sig; } #endif @@ -489,8 +490,7 @@ void chksigs(void) #ifdef DEBUG kprintf("process terminated by signal %d\n", j); #endif - dump_core(j); - doexit((uint16_t)j << 8); + doexit(dump_core(j)); } else if (*svec != SIG_IGN) { /* Arrange to call the user routine at return */ udata.u_ptab->p_pending &= ~m; // unset the bit diff --git a/Kernel/syscall_proc.c b/Kernel/syscall_proc.c index 8ea506c0..025d301f 100644 --- a/Kernel/syscall_proc.c +++ b/Kernel/syscall_proc.c @@ -346,7 +346,7 @@ int16_t val; arg_t __exit(void) { /* Deliberately chop to 8bits */ - doexit(val & 0xFF); + doexit(val << 8); return 0; // ... yeah. that might not happen. } -- 2.34.1