add some bounds, for a subsequent commit:

• all writers of exstat ensure the value is in [0; 0xFF]
• all readers of exstat AND it with 0xFF (not strictly needed thus)
• trap_exstat is “safe”, i.e. always either -1 or [0; 0xFF]
This commit is contained in:
tg 2012-10-21 21:39:06 +00:00
parent bebb2d2254
commit 31f24a4040
6 changed files with 22 additions and 20 deletions

10
exec.c
View File

@ -23,7 +23,7 @@
#include "sh.h" #include "sh.h"
__RCSID("$MirOS: src/bin/mksh/exec.c,v 1.102 2012/10/21 21:26:39 tg Exp $"); __RCSID("$MirOS: src/bin/mksh/exec.c,v 1.103 2012/10/21 21:39:01 tg Exp $");
#ifndef MKSH_DEFAULT_EXECSHELL #ifndef MKSH_DEFAULT_EXECSHELL
#define MKSH_DEFAULT_EXECSHELL "/bin/sh" #define MKSH_DEFAULT_EXECSHELL "/bin/sh"
@ -464,7 +464,7 @@ execute(struct op * volatile t,
errorf("%s: %s", s, strerror(rv)); errorf("%s: %s", s, strerror(rv));
} }
Break: Break:
exstat = rv; exstat = rv & 0xFF;
if (vp_pipest->flag & INT_L) { if (vp_pipest->flag & INT_L) {
unset(vp_pipest, 1); unset(vp_pipest, 1);
vp_pipest->flag = DEFINED | ISSET | INTEGER | RDONLY | vp_pipest->flag = DEFINED | ISSET | INTEGER | RDONLY |
@ -741,7 +741,7 @@ comexec(struct op *t, struct tbl * volatile tp, const char **ap,
e->type = E_FUNC; e->type = E_FUNC;
if (!(i = kshsetjmp(e->jbuf))) { if (!(i = kshsetjmp(e->jbuf))) {
/* seems odd to pass XERROK here, but AT&T ksh does */ /* seems odd to pass XERROK here, but AT&T ksh does */
exstat = execute(tp->val.t, flags & XERROK, xerrok); exstat = execute(tp->val.t, flags & XERROK, xerrok) & 0xFF;
i = LRETURN; i = LRETURN;
} }
kshname = old_kshname; kshname = old_kshname;
@ -762,7 +762,7 @@ comexec(struct op *t, struct tbl * volatile tp, const char **ap,
switch (i) { switch (i) {
case LRETURN: case LRETURN:
case LERROR: case LERROR:
rv = exstat; rv = exstat & 0xFF;
break; break;
case LINTR: case LINTR:
case LEXIT: case LEXIT:
@ -822,7 +822,7 @@ comexec(struct op *t, struct tbl * volatile tp, const char **ap,
} }
Leave: Leave:
if (flags & XEXEC) { if (flags & XEXEC) {
exstat = rv; exstat = rv & 0xFF;
unwind(LLEAVE); unwind(LLEAVE);
} }
return (rv); return (rv);

View File

@ -38,7 +38,7 @@
#endif #endif
#endif #endif
__RCSID("$MirOS: src/bin/mksh/funcs.c,v 1.226 2012/10/03 17:24:19 tg Exp $"); __RCSID("$MirOS: src/bin/mksh/funcs.c,v 1.227 2012/10/21 21:39:02 tg Exp $");
#if HAVE_KILLPG #if HAVE_KILLPG
/* /*
@ -2280,7 +2280,7 @@ c_exitreturn(const char **wp)
exstat = 1; exstat = 1;
warningf(true, "%s: %s", arg, "bad number"); warningf(true, "%s: %s", arg, "bad number");
} else } else
exstat = n; exstat = n & 0xFF;
} else if (trap_exstat != -1) } else if (trap_exstat != -1)
exstat = trap_exstat; exstat = trap_exstat;
if (wp[0][0] == 'r') { if (wp[0][0] == 'r') {

View File

@ -27,7 +27,7 @@
#include <sys/file.h> #include <sys/file.h>
#endif #endif
__RCSID("$MirOS: src/bin/mksh/histrap.c,v 1.126 2012/06/24 19:47:11 tg Exp $"); __RCSID("$MirOS: src/bin/mksh/histrap.c,v 1.127 2012/10/21 21:39:03 tg Exp $");
Trap sigtraps[NSIG + 1]; Trap sigtraps[NSIG + 1];
static struct sigaction Sigact_ign; static struct sigaction Sigact_ign;
@ -1224,12 +1224,12 @@ runtrap(Trap *p, bool is_last)
/* SIG_DFL */ /* SIG_DFL */
if (p->flags & TF_FATAL) { if (p->flags & TF_FATAL) {
/* eg, SIGHUP */ /* eg, SIGHUP */
exstat = 128 + i; exstat = (int)ksh_min(128U + (unsigned)i, 255U);
unwind(LLEAVE); unwind(LLEAVE);
} }
if (p->flags & TF_DFL_INTR) { if (p->flags & TF_DFL_INTR) {
/* eg, SIGINT, SIGQUIT, SIGTERM, etc. */ /* eg, SIGINT, SIGQUIT, SIGTERM, etc. */
exstat = 128 + i; exstat = (int)ksh_min(128U + (unsigned)i, 255U);
unwind(LINTR); unwind(LINTR);
} }
goto donetrap; goto donetrap;
@ -1244,7 +1244,7 @@ runtrap(Trap *p, bool is_last)
p->trap = NULL; p->trap = NULL;
} }
if (trap_exstat == -1) if (trap_exstat == -1)
trap_exstat = exstat; trap_exstat = exstat & 0xFF;
/* /*
* Note: trapstr is fully parsed before anything is executed, thus * Note: trapstr is fully parsed before anything is executed, thus
* no problem with afree(p->trap) in settrap() while still in use. * no problem with afree(p->trap) in settrap() while still in use.

12
main.c
View File

@ -34,7 +34,7 @@
#include <locale.h> #include <locale.h>
#endif #endif
__RCSID("$MirOS: src/bin/mksh/main.c,v 1.230 2012/10/21 21:26:40 tg Exp $"); __RCSID("$MirOS: src/bin/mksh/main.c,v 1.231 2012/10/21 21:39:04 tg Exp $");
extern char **environ; extern char **environ;
@ -711,7 +711,7 @@ include(const char *name, int argc, const char **argv, int intr_ok)
* intr_ok is set if we are including .profile or $ENV. * intr_ok is set if we are including .profile or $ENV.
* If user ^Cs out, we don't want to kill the shell... * If user ^Cs out, we don't want to kill the shell...
*/ */
if (intr_ok && (exstat - 128) != SIGTERM) if (intr_ok && ((exstat & 0xFF) - 128) != SIGTERM)
return (1); return (1);
/* FALLTHROUGH */ /* FALLTHROUGH */
case LEXIT: case LEXIT:
@ -855,7 +855,7 @@ shell(Source * volatile s, volatile bool toplevel)
t->u.evalflags |= DOTCOMEXEC; t->u.evalflags |= DOTCOMEXEC;
#endif #endif
if (!Flag(FNOEXEC) || (s->flags & SF_TTY)) if (!Flag(FNOEXEC) || (s->flags & SF_TTY))
exstat = execute(t, 0, NULL); exstat = execute(t, 0, NULL) & 0xFF;
if (t->type != TEOF && interactive && really_exit) if (t->type != TEOF && interactive && really_exit)
really_exit = false; really_exit = false;
@ -865,7 +865,7 @@ shell(Source * volatile s, volatile bool toplevel)
} }
quitenv(NULL); quitenv(NULL);
source = old_source; source = old_source;
return (exstat); return (exstat & 0xFF);
} }
/* return to closest error handler or shell(), exit if none found */ /* return to closest error handler or shell(), exit if none found */
@ -961,7 +961,7 @@ quitenv(struct shf *shf)
#endif #endif
j_exit(); j_exit();
if (ep->flags & EF_FAKE_SIGDIE) { if (ep->flags & EF_FAKE_SIGDIE) {
int sig = exstat - 128; int sig = (exstat & 0xFF) - 128;
/* /*
* ham up our death a bit (AT&T ksh * ham up our death a bit (AT&T ksh
@ -980,7 +980,7 @@ quitenv(struct shf *shf)
if (shf) if (shf)
shf_close(shf); shf_close(shf);
reclaim(); reclaim();
exit(exstat); exit(exstat & 0xFF);
} }
if (shf) if (shf)
shf_close(shf); shf_close(shf);

4
sh.h
View File

@ -157,7 +157,7 @@
#endif #endif
#ifdef EXTERN #ifdef EXTERN
__RCSID("$MirOS: src/bin/mksh/sh.h,v 1.593 2012/10/21 21:26:41 tg Exp $"); __RCSID("$MirOS: src/bin/mksh/sh.h,v 1.594 2012/10/21 21:39:05 tg Exp $");
#endif #endif
#define MKSH_VERSION "R40 2012/10/03" #define MKSH_VERSION "R40 2012/10/03"
@ -293,6 +293,8 @@ struct rusage {
#define ksh_toupper(c) (((c) >= 'a') && ((c) <= 'z') ? (c) - 'a' + 'A' : (c)) #define ksh_toupper(c) (((c) >= 'a') && ((c) <= 'z') ? (c) - 'a' + 'A' : (c))
#define ksh_isdash(s) (((s) != NULL) && ((s)[0] == '-') && ((s)[1] == '\0')) #define ksh_isdash(s) (((s) != NULL) && ((s)[0] == '-') && ((s)[1] == '\0'))
#define ksh_isspace(c) ((((c) >= 0x09) && ((c) <= 0x0D)) || ((c) == 0x20)) #define ksh_isspace(c) ((((c) >= 0x09) && ((c) <= 0x0D)) || ((c) == 0x20))
#define ksh_min(x,y) ((x) < (y) ? (x) : (y))
#define ksh_max(x,y) ((x) > (y) ? (x) : (y))
#ifdef MKSH__NO_PATH_MAX #ifdef MKSH__NO_PATH_MAX
#undef PATH_MAX #undef PATH_MAX

4
var.c
View File

@ -27,7 +27,7 @@
#include <sys/sysctl.h> #include <sys/sysctl.h>
#endif #endif
__RCSID("$MirOS: src/bin/mksh/var.c,v 1.153 2012/07/30 21:37:17 tg Exp $"); __RCSID("$MirOS: src/bin/mksh/var.c,v 1.154 2012/10/21 21:39:06 tg Exp $");
/*- /*-
* Variables * Variables
@ -260,7 +260,7 @@ global(const char *n)
vp->flag &= ~(ISSET|INTEGER); vp->flag &= ~(ISSET|INTEGER);
break; break;
case '?': case '?':
vp->val.i = exstat; vp->val.i = exstat & 0xFF;
break; break;
case '#': case '#':
vp->val.i = l->argc; vp->val.i = l->argc;