fix some zo-verification bugs that Casey found
svn: r13975
This commit is contained in:
parent
25e7978999
commit
aa4587890d
|
@ -10201,6 +10201,9 @@ void scheme_validate_closure(Mz_CPort *port, Scheme_Object *expr,
|
||||||
char *new_stack;
|
char *new_stack;
|
||||||
struct Validate_Clearing *vc;
|
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;
|
sz = data->max_let_depth;
|
||||||
new_stack = scheme_malloc_atomic(sz);
|
new_stack = scheme_malloc_atomic(sz);
|
||||||
memset(new_stack, VALID_NOT, sz - data->num_params - data->closure_size);
|
memset(new_stack, VALID_NOT, sz - data->num_params - data->closure_size);
|
||||||
|
@ -10255,7 +10258,7 @@ static void validate_unclosed_procedure(Mz_CPort *port, Scheme_Object *expr,
|
||||||
sz = data->closure_size;
|
sz = data->closure_size;
|
||||||
}
|
}
|
||||||
map = data->closure_map;
|
map = data->closure_map;
|
||||||
|
|
||||||
if (sz)
|
if (sz)
|
||||||
closure_stack = scheme_malloc_atomic(sz);
|
closure_stack = scheme_malloc_atomic(sz);
|
||||||
else
|
else
|
||||||
|
@ -10284,7 +10287,7 @@ static void validate_unclosed_procedure(Mz_CPort *port, Scheme_Object *expr,
|
||||||
if (q == self_pos)
|
if (q == self_pos)
|
||||||
self_pos_in_closure = i;
|
self_pos_in_closure = i;
|
||||||
p = q + delta;
|
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);
|
scheme_ill_formed_code(port);
|
||||||
vld = stack[p];
|
vld = stack[p];
|
||||||
if (vld == VALID_VAL_NOCLEAR)
|
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,
|
scheme_validate_expr(port, lv->value, stack, tls, depth, letlimit, delta, num_toplevels, num_stxes, num_lifts,
|
||||||
NULL, 0, 0, vc, 0);
|
NULL, 0, 0, vc, 0);
|
||||||
memset(stack, VALID_NOT, delta);
|
/* memset(stack, VALID_NOT, delta); <-- seems unnecessary (and slow) */
|
||||||
|
|
||||||
c = lv->count;
|
c = lv->count;
|
||||||
q = lv->position;
|
q = lv->position;
|
||||||
|
@ -10737,7 +10740,7 @@ void scheme_validate_expr(Mz_CPort *port, Scheme_Object *expr,
|
||||||
|
|
||||||
c = l->count;
|
c = l->count;
|
||||||
|
|
||||||
if ((c < 0) || (c + delta > depth))
|
if ((c < 0) || (c + delta >= depth))
|
||||||
scheme_ill_formed_code(port);
|
scheme_ill_formed_code(port);
|
||||||
|
|
||||||
for (i = 0; i < c; i++) {
|
for (i = 0; i < c; i++) {
|
||||||
|
@ -10828,7 +10831,8 @@ 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)
|
void scheme_validate_boxenv(int p, Mz_CPort *port, char *stack, int depth, int delta)
|
||||||
{
|
{
|
||||||
p += delta;
|
if (p >= 0)
|
||||||
|
p += delta;
|
||||||
|
|
||||||
if ((p < 0) || (p >= depth) || (stack[p] != VALID_VAL))
|
if ((p < 0) || (p >= depth) || (stack[p] != VALID_VAL))
|
||||||
scheme_ill_formed_code(port);
|
scheme_ill_formed_code(port);
|
||||||
|
|
|
@ -8525,9 +8525,11 @@ static Scheme_Object *read_compiled_closure(Scheme_Object *obj)
|
||||||
v = SCHEME_CAR(obj);
|
v = SCHEME_CAR(obj);
|
||||||
obj = SCHEME_CDR(obj);
|
obj = SCHEME_CDR(obj);
|
||||||
data->num_params = SCHEME_INT_VAL(v);
|
data->num_params = SCHEME_INT_VAL(v);
|
||||||
|
if (data->num_params < 0) return NULL;
|
||||||
|
|
||||||
if (!SCHEME_PAIRP(obj)) return NULL;
|
if (!SCHEME_PAIRP(obj)) return NULL;
|
||||||
data->max_let_depth = SCHEME_INT_VAL(SCHEME_CAR(obj));
|
data->max_let_depth = SCHEME_INT_VAL(SCHEME_CAR(obj));
|
||||||
|
if (data->max_let_depth < 0) return NULL;
|
||||||
obj = SCHEME_CDR(obj);
|
obj = SCHEME_CDR(obj);
|
||||||
|
|
||||||
if (!SCHEME_PAIRP(obj)) return NULL;
|
if (!SCHEME_PAIRP(obj)) return NULL;
|
||||||
|
|
|
@ -4347,7 +4347,7 @@ static Scheme_Object *read_compact_svector(CPort *port, int l)
|
||||||
o->type = scheme_svector_type;
|
o->type = scheme_svector_type;
|
||||||
|
|
||||||
SCHEME_SVEC_LEN(o) = l;
|
SCHEME_SVEC_LEN(o) = l;
|
||||||
if (l)
|
if (l > 0)
|
||||||
v = MALLOC_N_ATOMIC(mzshort, l);
|
v = MALLOC_N_ATOMIC(mzshort, l);
|
||||||
else
|
else
|
||||||
v = NULL;
|
v = NULL;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user