summaryrefslogtreecommitdiffstats
path: root/struct.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2017-02-20 07:10:13 -0800
committerKaz Kylheku <kaz@kylheku.com>2017-02-20 07:10:13 -0800
commit633d1a10a7509e052571ea3db6f44157e6620326 (patch)
tree15fdb00ef1899801b80e6b341c344fbfe159fc87 /struct.c
parent1251a804e742ddb4963af5d48213d20358ee639a (diff)
downloadtxr-633d1a10a7509e052571ea3db6f44157e6620326.tar.gz
txr-633d1a10a7509e052571ea3db6f44157e6620326.tar.bz2
txr-633d1a10a7509e052571ea3db6f44157e6620326.zip
Fix lack of robustness in struct module.
The symbolp test is too weak before calling lookup_slot, because nil satisfies it, but lookup_slot dereferences the symbol pointer to access its slot cache. One of many test cases: parsing #S(time nil nil) segfaults. * struct.c (slot, maybe_slot, slotset, uslot_fun, umethod_fun, umethod_args_fun): Check that sym isn't nil before looking it up as a slot.
Diffstat (limited to 'struct.c')
-rw-r--r--struct.c12
1 files changed, 6 insertions, 6 deletions
diff --git a/struct.c b/struct.c
index 9805f5f8..5a0e4734 100644
--- a/struct.c
+++ b/struct.c
@@ -859,7 +859,7 @@ val slot(val strct, val sym)
const val self = lit("slot");
struct struct_inst *si = struct_handle(strct, self);
- if (symbolp(sym)) {
+ if (sym && symbolp(sym)) {
loc ptr = lookup_slot_load(strct, si, sym);
if (!nullocp(ptr))
return deref(ptr);
@@ -873,7 +873,7 @@ val maybe_slot(val strct, val sym)
const val self = lit("slot");
struct struct_inst *si = struct_handle(strct, self);
- if (symbolp(sym)) {
+ if (sym && symbolp(sym)) {
loc ptr = lookup_slot_load(strct, si, sym);
if (!nullocp(ptr))
return deref(ptr);
@@ -887,7 +887,7 @@ val slotset(val strct, val sym, val newval)
const val self = lit("slotset");
struct struct_inst *si = struct_handle(strct, self);
- if (symbolp(sym)) {
+ if (sym && symbolp(sym)) {
loc ptr = lookup_slot(strct, si, sym);
if (!nullocp(ptr)) {
if (!si->dirty) {
@@ -1213,7 +1213,7 @@ static val uslot_fun(val sym, val strct)
val self = lit("uslot");
struct struct_inst *si = struct_handle(strct, self);
- if (symbolp(sym)) {
+ if (sym && symbolp(sym)) {
loc ptr = lookup_slot(strct, si, sym);
if (!nullocp(ptr))
return deref(ptr);
@@ -1239,7 +1239,7 @@ static val umethod_fun(val sym, struct args *args)
struct struct_inst *si = struct_handle(strct, self);
- if (symbolp(sym)) {
+ if (sym && symbolp(sym)) {
loc ptr = lookup_slot(strct, si, sym);
if (!nullocp(ptr))
return generic_funcall(deref(ptr), args);
@@ -1269,7 +1269,7 @@ static val umethod_args_fun(val env, struct args *args)
struct struct_inst *si = struct_handle(strct, self);
- if (symbolp(sym)) {
+ if (sym && symbolp(sym)) {
loc ptr = lookup_slot(strct, si, sym);
if (!nullocp(ptr))
return generic_funcall(deref(ptr), args_call);