exit.c: Truncate exit status to uint8_t
authorMatt Fleming <matt.fleming@linux.intel.com>
Fri, 15 Apr 2011 10:48:37 +0000 (11:48 +0100)
committerMatt Fleming <matt.fleming@linux.intel.com>
Tue, 26 Apr 2011 09:05:38 +0000 (10:05 +0100)
commit5af736cf7677485da73bdc7ea4633960c8640cb6
tree236c19a0d4e9e28921be481004801b3458060e6a
parent74518b8b691c8aba1425673864c45b7721d9a738
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 <hpa@zytor.com>
Signed-off-by: Matt Fleming <matt.fleming@linux.intel.com>
com32/lib/exit.c