fix some zo-verification bugs that Casey found

svn: r13975
This commit is contained in:
Matthew Flatt 2009-03-06 02:22:40 +00:00
parent 25e7978999
commit aa4587890d
3 changed files with 12 additions and 6 deletions

View File

@ -10201,6 +10201,9 @@ void scheme_validate_closure(Mz_CPort *port, Scheme_Object *expr,
char *new_stack;
struct Validate_Clearing *vc;
if (data->max_let_depth < (data->num_params + data->closure_size))
scheme_ill_formed_code(port);
sz = data->max_let_depth;
new_stack = scheme_malloc_atomic(sz);
memset(new_stack, VALID_NOT, sz - data->num_params - data->closure_size);
@ -10284,7 +10287,7 @@ static void validate_unclosed_procedure(Mz_CPort *port, Scheme_Object *expr,
if (q == self_pos)
self_pos_in_closure = i;
p = q + delta;
if ((q < 0) || (p > depth) || (stack[p] == VALID_NOT))
if ((q < 0) || (p >= depth) || (stack[p] == VALID_NOT))
scheme_ill_formed_code(port);
vld = stack[p];
if (vld == VALID_VAL_NOCLEAR)
@ -10679,7 +10682,7 @@ void scheme_validate_expr(Mz_CPort *port, Scheme_Object *expr,
scheme_validate_expr(port, lv->value, stack, tls, depth, letlimit, delta, num_toplevels, num_stxes, num_lifts,
NULL, 0, 0, vc, 0);
memset(stack, VALID_NOT, delta);
/* memset(stack, VALID_NOT, delta); <-- seems unnecessary (and slow) */
c = lv->count;
q = lv->position;
@ -10737,7 +10740,7 @@ void scheme_validate_expr(Mz_CPort *port, Scheme_Object *expr,
c = l->count;
if ((c < 0) || (c + delta > depth))
if ((c < 0) || (c + delta >= depth))
scheme_ill_formed_code(port);
for (i = 0; i < c; i++) {
@ -10828,6 +10831,7 @@ void scheme_validate_toplevel(Scheme_Object *expr, Mz_CPort *port,
void scheme_validate_boxenv(int p, Mz_CPort *port, char *stack, int depth, int delta)
{
if (p >= 0)
p += delta;
if ((p < 0) || (p >= depth) || (stack[p] != VALID_VAL))

View File

@ -8525,9 +8525,11 @@ static Scheme_Object *read_compiled_closure(Scheme_Object *obj)
v = SCHEME_CAR(obj);
obj = SCHEME_CDR(obj);
data->num_params = SCHEME_INT_VAL(v);
if (data->num_params < 0) return NULL;
if (!SCHEME_PAIRP(obj)) return NULL;
data->max_let_depth = SCHEME_INT_VAL(SCHEME_CAR(obj));
if (data->max_let_depth < 0) return NULL;
obj = SCHEME_CDR(obj);
if (!SCHEME_PAIRP(obj)) return NULL;

View File

@ -4347,7 +4347,7 @@ static Scheme_Object *read_compact_svector(CPort *port, int l)
o->type = scheme_svector_type;
SCHEME_SVEC_LEN(o) = l;
if (l)
if (l > 0)
v = MALLOC_N_ATOMIC(mzshort, l);
else
v = NULL;