diff --git a/src/Expr.cc b/src/Expr.cc index 996a36625e..3c9be75bf9 100644 --- a/src/Expr.cc +++ b/src/Expr.cc @@ -3119,12 +3119,40 @@ void IndexExpr::Assign(Frame* f, Val* v, Opcode op) switch ( v1->Type()->Tag() ) { case TYPE_VECTOR: if ( ! v1->AsVectorVal()->Assign(v2, v, op) ) - Internal("assignment failed"); + { + if ( v ) + { + ODesc d; + v->Describe(&d); + auto vt = v->Type(); + auto vtt = vt->Tag(); + std::string tn = vtt == TYPE_RECORD ? vt->GetName() : type_name(vtt); + Internal(fmt( + "vector index assignment failed for invalid type '%s', value: %s", + tn.data(), d.Description())); + } + else + Internal("assignment failed with null value"); + } break; case TYPE_TABLE: if ( ! v1->AsTableVal()->Assign(v2, v, op) ) - Internal("assignment failed"); + { + if ( v ) + { + ODesc d; + v->Describe(&d); + auto vt = v->Type(); + auto vtt = vt->Tag(); + std::string tn = vtt == TYPE_RECORD ? vt->GetName() : type_name(vtt); + Internal(fmt( + "table index assignment failed for invalid type '%s', value: %s", + tn.data(), d.Description())); + } + else + Internal("assignment failed with null value"); + } break; case TYPE_STRING: diff --git a/testing/btest/Baseline/language.index-assignment-invalid/out b/testing/btest/Baseline/language.index-assignment-invalid/out new file mode 100644 index 0000000000..879e1b8fb7 --- /dev/null +++ b/testing/btest/Baseline/language.index-assignment-invalid/out @@ -0,0 +1 @@ +internal error in /Users/jon/projects/bro/bro/scripts/base/utils/queue.bro, line 152: vector index assignment failed for invalid type 'myrec', value: [a=T, b=hi, c=] (Queue::ret[Queue::j]) diff --git a/testing/btest/language/index-assignment-invalid.bro b/testing/btest/language/index-assignment-invalid.bro new file mode 100644 index 0000000000..6425ca5b1a --- /dev/null +++ b/testing/btest/language/index-assignment-invalid.bro @@ -0,0 +1,31 @@ +# @TEST-EXEC-FAIL: bro -b %INPUT >out 2>&1 +# @TEST-EXEC: TEST_DIFF_CANONIFIER=$SCRIPTS/diff-remove-abspath btest-diff out + +@load base/utils/queue + +global q: Queue::Queue = Queue::init(); + +type myrec: record { + a: bool &default=T; + b: string &default="hi"; + c: string &optional; +}; + +function foo(mr: myrec) + { + print mr$a; + print mr$c; + print mr$b; + } + +event bro_init() + { + Queue::put(q, "hello"); + Queue::put(q, "goodbye"); + Queue::put(q, "test"); + Queue::put(q, myrec()); + + local rval: vector of string = vector(); + Queue::get_vector(q, rval); + print rval; + }