Skip to content

Commit 775c5d2

Browse files
authored
Add boundscheck in speccache_eq to avoid OOB access due to data race (#159)
1 parent 7afe5a0 commit 775c5d2

File tree

1 file changed

+3
-1
lines changed

1 file changed

+3
-1
lines changed

src/gf.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ static int8_t jl_cachearg_offset(jl_methtable_t *mt)
112112

113113
static uint_t speccache_hash(size_t idx, jl_svec_t *data)
114114
{
115-
jl_method_instance_t *ml = (jl_method_instance_t*)jl_svecref(data, idx);
115+
jl_method_instance_t *ml = (jl_method_instance_t*)jl_svecref(data, idx); // This must always happen inside the lock
116116
jl_value_t *sig = ml->specTypes;
117117
if (jl_is_unionall(sig))
118118
sig = jl_unwrap_unionall(sig);
@@ -121,6 +121,8 @@ static uint_t speccache_hash(size_t idx, jl_svec_t *data)
121121

122122
static int speccache_eq(size_t idx, const void *ty, jl_svec_t *data, uint_t hv)
123123
{
124+
if (idx >= jl_svec_len(data))
125+
return 0; // We got a OOB access, probably due to a data race
124126
jl_method_instance_t *ml = (jl_method_instance_t*)jl_svecref(data, idx);
125127
jl_value_t *sig = ml->specTypes;
126128
if (ty == sig)

0 commit comments

Comments
 (0)