a couple of small fixes ( default values, all null lines)

This commit is contained in:
Bernhard Amann 2012-03-11 19:41:41 -07:00
parent cd78005d09
commit faf5c95752

View file

@ -104,7 +104,6 @@ struct Manager::ReaderInfo {
EnumVal* type; EnumVal* type;
ReaderFrontend* reader; ReaderFrontend* reader;
//list<string> events; // events we fire when "something" happens
map<int, Manager::Filter*> filters; // filters that can prevent our actions map<int, Manager::Filter*> filters; // filters that can prevent our actions
bool HasFilter(int id); bool HasFilter(int id);
@ -160,7 +159,7 @@ ReaderBackend* Manager::CreateBackend(ReaderFrontend* frontend, bro_int_t type)
while ( true ) { while ( true ) {
if ( ir->type == BifEnum::Input::READER_DEFAULT ) if ( ir->type == BifEnum::Input::READER_DEFAULT )
{ {
reporter->Error("unknown reader when creating reader"); reporter->Error("The reader that was requested was not found and could not be initialized.");
return 0; return 0;
} }
@ -181,7 +180,7 @@ ReaderBackend* Manager::CreateBackend(ReaderFrontend* frontend, bro_int_t type)
} else { } else {
// ohok. init failed, kill factory for all eternity // ohok. init failed, kill factory for all eternity
ir->factory = 0; ir->factory = 0;
DBG_LOG(DBG_LOGGING, "failed to init input class %s", ir->name); DBG_LOG(DBG_LOGGING, "Failed to init input class %s", ir->name);
return 0; return 0;
} }
@ -225,8 +224,11 @@ ReaderFrontend* Manager::CreateStream(EnumVal* id, RecordVal* description)
assert(reader_obj); assert(reader_obj);
// get the source... // get the source...
const BroString* bsource = description->Lookup(rtype->FieldOffset("source"))->AsString(); Val* sourceval = description->LookupWithDefault(rtype->FieldOffset("source"));
assert ( sourceval != 0 );
const BroString* bsource = sourceval->AsString();
string source((const char*) bsource->Bytes(), bsource->Len()); string source((const char*) bsource->Bytes(), bsource->Len());
Unref(sourceval);
ReaderInfo* info = new ReaderInfo; ReaderInfo* info = new ReaderInfo;
info->reader = reader_obj; info->reader = reader_obj;
@ -255,13 +257,14 @@ bool Manager::AddEventFilter(EnumVal *id, RecordVal* fval) {
return false; return false;
} }
Val* name = fval->Lookup(rtype->FieldOffset("name")); Val* name = fval->LookupWithDefault(rtype->FieldOffset("name"));
RecordType *fields = fval->Lookup(rtype->FieldOffset("fields"))->AsType()->AsTypeType()->Type()->AsRecordType(); RecordType *fields = fval->LookupWithDefault(rtype->FieldOffset("fields"))->AsType()->AsTypeType()->Type()->AsRecordType();
Val *want_record = fval->LookupWithDefault(rtype->FieldOffset("want_record")); Val *want_record = fval->LookupWithDefault(rtype->FieldOffset("want_record"));
Val* event_val = fval->Lookup(rtype->FieldOffset("ev")); Val* event_val = fval->LookupWithDefault(rtype->FieldOffset("ev"));
Func* event = event_val->AsFunc(); Func* event = event_val->AsFunc();
Unref(event_val);
{ {
FuncType* etype = event->FType()->AsFuncType(); FuncType* etype = event->FType()->AsFuncType();
@ -330,8 +333,10 @@ bool Manager::AddEventFilter(EnumVal *id, RecordVal* fval) {
logf[i] = fieldsV[i]; logf[i] = fieldsV[i];
} }
Unref(fields); // ref'd by lookupwithdefault
EventFilter* filter = new EventFilter(); EventFilter* filter = new EventFilter();
filter->name = name->AsString()->CheckString(); filter->name = name->AsString()->CheckString();
Unref(name); // ref'd by lookupwithdefault
filter->id = id->Ref()->AsEnumVal(); filter->id = id->Ref()->AsEnumVal();
filter->num_fields = fieldsV.size(); filter->num_fields = fieldsV.size();
filter->fields = fields->Ref()->AsRecordType(); filter->fields = fields->Ref()->AsRecordType();
@ -369,8 +374,9 @@ bool Manager::AddTableFilter(EnumVal *id, RecordVal* fval) {
RecordType *idx = fval->LookupWithDefault(rtype->FieldOffset("idx"))->AsType()->AsTypeType()->Type()->AsRecordType(); RecordType *idx = fval->LookupWithDefault(rtype->FieldOffset("idx"))->AsType()->AsTypeType()->Type()->AsRecordType();
RecordType *val = 0; RecordType *val = 0;
if ( fval->Lookup(rtype->FieldOffset("val")) != 0 ) { if ( fval->LookupWithDefault(rtype->FieldOffset("val")) != 0 ) {
val = fval->LookupWithDefault(rtype->FieldOffset("val"))->AsType()->AsTypeType()->Type()->AsRecordType(); val = fval->LookupWithDefault(rtype->FieldOffset("val"))->AsType()->AsTypeType()->Type()->AsRecordType();
Unref(val); // The lookupwithdefault in the if-clause ref'ed val.
} }
TableVal *dst = fval->LookupWithDefault(rtype->FieldOffset("destination"))->AsTableVal(); TableVal *dst = fval->LookupWithDefault(rtype->FieldOffset("destination"))->AsTableVal();
@ -780,10 +786,12 @@ int Manager::SendEntryTable(const ReaderFrontend* reader, const int id, const Va
assert(i->filters[id]->filter_type == TABLE_FILTER); assert(i->filters[id]->filter_type == TABLE_FILTER);
TableFilter* filter = (TableFilter*) i->filters[id]; TableFilter* filter = (TableFilter*) i->filters[id];
//reporter->Error("Hashing %d index fields", i->num_idx_fields);
HashKey* idxhash = HashValues(filter->num_idx_fields, vals); HashKey* idxhash = HashValues(filter->num_idx_fields, vals);
//reporter->Error("Result: %d\n", (uint64_t) idxhash->Hash());
//reporter->Error("Hashing %d val fields", i->num_val_fields); if ( idxhash == 0 ) {
reporter->Error("Could not hash line. Ignoring");
return filter->num_val_fields + filter->num_idx_fields;
}
hash_t valhash = 0; hash_t valhash = 0;
if ( filter->num_val_fields > 0 ) { if ( filter->num_val_fields > 0 ) {
@ -792,10 +800,6 @@ int Manager::SendEntryTable(const ReaderFrontend* reader, const int id, const Va
delete(valhashkey); delete(valhashkey);
} }
//reporter->Error("Result: %d", (uint64_t) valhash->Hash());
//reporter->Error("received entry with idxhash %d and valhash %d", (uint64_t) idxhash->Hash(), (uint64_t) valhash->Hash());
InputHash *h = filter->lastDict->Lookup(idxhash); InputHash *h = filter->lastDict->Lookup(idxhash);
if ( h != 0 ) { if ( h != 0 ) {
// seen before // seen before
@ -1609,14 +1613,16 @@ HashKey* Manager::HashValues(const int num_elements, const Value* const *vals) {
length += GetValueLength(val); length += GetValueLength(val);
} }
//reporter->Error("Length: %d", length); if ( length == 0 ) {
reporter->Error("Input reader sent line where all elements are null values. Ignoring line");
return NULL;
}
int position = 0; int position = 0;
char *data = (char*) malloc(length); char *data = (char*) malloc(length);
if ( data == 0 ) { if ( data == 0 ) {
reporter->InternalError("Could not malloc?"); reporter->InternalError("Could not malloc?");
} }
//memset(data, 0, length);
for ( int i = 0; i < num_elements; i++ ) { for ( int i = 0; i < num_elements; i++ ) {
const Value* val = vals[i]; const Value* val = vals[i];
if ( val->present ) if ( val->present )