From 5af736cf7677485da73bdc7ea4633960c8640cb6 Mon Sep 17 00:00:00 2001 From: Matt Fleming Date: Fri, 15 Apr 2011 11:48:37 +0100 Subject: [PATCH] exit.c: Truncate exit status to uint8_t The valid range for an exit status is 0 - 255, so we need to truncate the value passed to _exit(). I noticed this when a module was doing _exit(-1), and ended up calling longjmp(.., 0xffffffff + 1) which meant that setjmp() in spawn_load() returned 0. Obviously, we wanted the setjmp() to return 256 (0xff + 1), because the code in spawn_load() handles the return value like so, ret_val = setjmp(module->u.x.process_exit); if (ret_val) ret_val--; /* Valid range is 0-255 */ else if (!module->main_func) ret_val = -1; else exit((module->main_func)(argc, argv)); /* Actually run! */ There actually is code in spawn_load() to properly truncate 'ret_val', but it is applied too late. The truncation needs to happen when we pass the exit status to longjmp(). Suggested-by: H. Peter Anvin Signed-off-by: Matt Fleming --- com32/lib/exit.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com32/lib/exit.c b/com32/lib/exit.c index cba6cee..ebec0a1 100644 --- a/com32/lib/exit.c +++ b/com32/lib/exit.c @@ -54,6 +54,6 @@ __noreturn _Exit(int rv) __noreturn _exit(int rv) { - longjmp(__syslinux_current->u.x.process_exit, rv+1); + longjmp(__syslinux_current->u.x.process_exit, (uint8_t)rv+1); } -- 2.7.4