diff --git a/CHANGES b/CHANGES index 455b409e7b..706db77a6b 100644 --- a/CHANGES +++ b/CHANGES @@ -1,4 +1,12 @@ +3.2.0-dev.834 | 2020-07-02 15:57:09 -0700 + + * GH-786: fix Val::As methods casting incomplete types (Jon Siwek, Corelight) + + * GH-786: fix Stmt::As methods casting incomplete types (Jon Siwek, Corelight) + + * GH-786: fix Expr::As methods casting incomplete types (Jon Siwek, Corelight) + 3.2.0-dev.830 | 2020-07-02 11:36:28 -0700 * GH-786: Move Type::As methods to cc file so they have type info for casting safely (Tim Wojtulewicz, Corelight) diff --git a/VERSION b/VERSION index c66b848cb6..2104f8aaa9 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -3.2.0-dev.830 +3.2.0-dev.834 diff --git a/src/Expr.cc b/src/Expr.cc index 4d92224d64..5d289b92ea 100644 --- a/src/Expr.cc +++ b/src/Expr.cc @@ -62,6 +62,54 @@ Expr::Expr(BroExprTag arg_tag) : tag(arg_tag), type(nullptr), paren(false) SetLocationInfo(&start_location, &end_location); } +const ListExpr* Expr::AsListExpr() const + { + CHECK_TAG(tag, EXPR_LIST, "ExprVal::AsListExpr", expr_name) + return (const ListExpr*) this; + } + +ListExpr* Expr::AsListExpr() + { + CHECK_TAG(tag, EXPR_LIST, "ExprVal::AsListExpr", expr_name) + return (ListExpr*) this; + } + +const NameExpr* Expr::AsNameExpr() const + { + CHECK_TAG(tag, EXPR_NAME, "ExprVal::AsNameExpr", expr_name) + return (const NameExpr*) this; + } + +NameExpr* Expr::AsNameExpr() + { + CHECK_TAG(tag, EXPR_NAME, "ExprVal::AsNameExpr", expr_name) + return (NameExpr*) this; + } + +const AssignExpr* Expr::AsAssignExpr() const + { + CHECK_TAG(tag, EXPR_ASSIGN, "ExprVal::AsAssignExpr", expr_name) + return (const AssignExpr*) this; + } + +AssignExpr* Expr::AsAssignExpr() + { + CHECK_TAG(tag, EXPR_ASSIGN, "ExprVal::AsAssignExpr", expr_name) + return (AssignExpr*) this; + } + +const IndexExpr* Expr::AsIndexExpr() const + { + CHECK_TAG(tag, EXPR_INDEX, "ExprVal::AsIndexExpr", expr_name) + return (const IndexExpr*) this; + } + +IndexExpr* Expr::AsIndexExpr() + { + CHECK_TAG(tag, EXPR_INDEX, "ExprVal::AsIndexExpr", expr_name) + return (IndexExpr*) this; + } + bool Expr::CanAdd() const { return false; diff --git a/src/Expr.h b/src/Expr.h index 67fad1a9d5..d70fbf1635 100644 --- a/src/Expr.h +++ b/src/Expr.h @@ -161,53 +161,17 @@ public: void MarkParen() { paren = true; } bool IsParen() const { return paren; } - const ListExpr* AsListExpr() const - { - CHECK_TAG(tag, EXPR_LIST, "ExprVal::AsListExpr", expr_name) - return (const ListExpr*) this; - } + const ListExpr* AsListExpr() const; + ListExpr* AsListExpr(); - ListExpr* AsListExpr() - { - CHECK_TAG(tag, EXPR_LIST, "ExprVal::AsListExpr", expr_name) - return (ListExpr*) this; - } + const NameExpr* AsNameExpr() const; + NameExpr* AsNameExpr(); - const NameExpr* AsNameExpr() const - { - CHECK_TAG(tag, EXPR_NAME, "ExprVal::AsNameExpr", expr_name) - return (const NameExpr*) this; - } + const AssignExpr* AsAssignExpr() const; + AssignExpr* AsAssignExpr(); - NameExpr* AsNameExpr() - { - CHECK_TAG(tag, EXPR_NAME, "ExprVal::AsNameExpr", expr_name) - return (NameExpr*) this; - } - - const AssignExpr* AsAssignExpr() const - { - CHECK_TAG(tag, EXPR_ASSIGN, "ExprVal::AsAssignExpr", expr_name) - return (const AssignExpr*) this; - } - - AssignExpr* AsAssignExpr() - { - CHECK_TAG(tag, EXPR_ASSIGN, "ExprVal::AsAssignExpr", expr_name) - return (AssignExpr*) this; - } - - const IndexExpr* AsIndexExpr() const - { - CHECK_TAG(tag, EXPR_INDEX, "ExprVal::AsIndexExpr", expr_name) - return (const IndexExpr*) this; - } - - IndexExpr* AsIndexExpr() - { - CHECK_TAG(tag, EXPR_INDEX, "ExprVal::AsIndexExpr", expr_name) - return (IndexExpr*) this; - } + const IndexExpr* AsIndexExpr() const; + IndexExpr* AsIndexExpr(); void Describe(ODesc* d) const override final; diff --git a/src/Stmt.cc b/src/Stmt.cc index a7919e52b2..98bcfb0bf5 100644 --- a/src/Stmt.cc +++ b/src/Stmt.cc @@ -51,6 +51,24 @@ Stmt::~Stmt() { } +StmtList* Stmt::AsStmtList() + { + CHECK_TAG(tag, STMT_LIST, "Stmt::AsStmtList", stmt_name) + return (StmtList*) this; + } + +const StmtList* Stmt::AsStmtList() const + { + CHECK_TAG(tag, STMT_LIST, "Stmt::AsStmtList", stmt_name) + return (const StmtList*) this; + } + +ForStmt* Stmt::AsForStmt() + { + CHECK_TAG(tag, STMT_FOR, "Stmt::AsForStmt", stmt_name) + return (ForStmt*) this; + } + bool Stmt::SetLocationInfo(const Location* start, const Location* end) { if ( ! BroObj::SetLocationInfo(start, end) ) diff --git a/src/Stmt.h b/src/Stmt.h index b39872aee8..dc744c9b4b 100644 --- a/src/Stmt.h +++ b/src/Stmt.h @@ -40,23 +40,10 @@ public: // True if the statement has no side effects, false otherwise. virtual bool IsPure() const; - StmtList* AsStmtList() - { - CHECK_TAG(tag, STMT_LIST, "Stmt::AsStmtList", stmt_name) - return (StmtList*) this; - } + StmtList* AsStmtList(); + const StmtList* AsStmtList() const; - const StmtList* AsStmtList() const - { - CHECK_TAG(tag, STMT_LIST, "Stmt::AsStmtList", stmt_name) - return (const StmtList*) this; - } - - ForStmt* AsForStmt() - { - CHECK_TAG(tag, STMT_FOR, "Stmt::AsForStmt", stmt_name) - return (ForStmt*) this; - } + ForStmt* AsForStmt(); void RegisterAccess() const { last_access = network_time; access_count++; } void AccessStats(ODesc* d) const; diff --git a/src/Val.cc b/src/Val.cc index 1f7a39b1d1..cb461dacfd 100644 --- a/src/Val.cc +++ b/src/Val.cc @@ -82,6 +82,36 @@ Val::~Val() #endif } +#define CONVERTER(tag, ctype, name) \ + ctype name() \ + { \ + CHECK_TAG(type->Tag(), tag, "Val::CONVERTER", zeek::type_name) \ + return (ctype)(this); \ + } + +#define CONST_CONVERTER(tag, ctype, name) \ + const ctype name() const \ + { \ + CHECK_TAG(type->Tag(), tag, "Val::CONVERTER", zeek::type_name) \ + return (const ctype)(this); \ + } + +#define CONVERTERS(tag, ctype, name) \ + CONVERTER(tag, ctype, name) \ + CONST_CONVERTER(tag, ctype, name) + +CONVERTERS(zeek::TYPE_PATTERN, PatternVal*, Val::AsPatternVal) +CONVERTERS(zeek::TYPE_PORT, PortVal*, Val::AsPortVal) +CONVERTERS(zeek::TYPE_SUBNET, SubNetVal*, Val::AsSubNetVal) +CONVERTERS(zeek::TYPE_ADDR, AddrVal*, Val::AsAddrVal) +CONVERTERS(zeek::TYPE_TABLE, TableVal*, Val::AsTableVal) +CONVERTERS(zeek::TYPE_RECORD, RecordVal*, Val::AsRecordVal) +CONVERTERS(zeek::TYPE_LIST, ListVal*, Val::AsListVal) +CONVERTERS(zeek::TYPE_STRING, StringVal*, Val::AsStringVal) +CONVERTERS(zeek::TYPE_VECTOR, VectorVal*, Val::AsVectorVal) +CONVERTERS(zeek::TYPE_ENUM, EnumVal*, Val::AsEnumVal) +CONVERTERS(zeek::TYPE_OPAQUE, OpaqueVal*, Val::AsOpaqueVal) + IntrusivePtr Val::CloneState::NewClone(Val* src, IntrusivePtr dst) { clones.insert(std::make_pair(src, dst.get())); diff --git a/src/Val.h b/src/Val.h index d57746103f..bf7868168b 100644 --- a/src/Val.h +++ b/src/Val.h @@ -277,42 +277,38 @@ public: bro_int_t ForceAsInt() const { return val.int_val; } bro_uint_t ForceAsUInt() const { return val.uint_val; } -#define CONVERTER(tag, ctype, name) \ - ctype name() \ - { \ - CHECK_TAG(type->Tag(), tag, "Val::CONVERTER", zeek::type_name) \ - return (ctype)(this); \ - } + PatternVal* AsPatternVal(); + const PatternVal* AsPatternVal() const; - CONVERTER(zeek::TYPE_PATTERN, PatternVal*, AsPatternVal) - CONVERTER(zeek::TYPE_PORT, PortVal*, AsPortVal) - CONVERTER(zeek::TYPE_SUBNET, SubNetVal*, AsSubNetVal) - CONVERTER(zeek::TYPE_ADDR, AddrVal*, AsAddrVal) - CONVERTER(zeek::TYPE_TABLE, TableVal*, AsTableVal) - CONVERTER(zeek::TYPE_RECORD, RecordVal*, AsRecordVal) - CONVERTER(zeek::TYPE_LIST, ListVal*, AsListVal) - CONVERTER(zeek::TYPE_STRING, StringVal*, AsStringVal) - CONVERTER(zeek::TYPE_VECTOR, VectorVal*, AsVectorVal) - CONVERTER(zeek::TYPE_ENUM, EnumVal*, AsEnumVal) - CONVERTER(zeek::TYPE_OPAQUE, OpaqueVal*, AsOpaqueVal) + PortVal* AsPortVal(); + const PortVal* AsPortVal() const; -#define CONST_CONVERTER(tag, ctype, name) \ - const ctype name() const \ - { \ - CHECK_TAG(type->Tag(), tag, "Val::CONVERTER", zeek::type_name) \ - return (const ctype)(this); \ - } + SubNetVal* AsSubNetVal(); + const SubNetVal* AsSubNetVal() const; - CONST_CONVERTER(zeek::TYPE_PATTERN, PatternVal*, AsPatternVal) - CONST_CONVERTER(zeek::TYPE_PORT, PortVal*, AsPortVal) - CONST_CONVERTER(zeek::TYPE_SUBNET, SubNetVal*, AsSubNetVal) - CONST_CONVERTER(zeek::TYPE_ADDR, AddrVal*, AsAddrVal) - CONST_CONVERTER(zeek::TYPE_TABLE, TableVal*, AsTableVal) - CONST_CONVERTER(zeek::TYPE_RECORD, RecordVal*, AsRecordVal) - CONST_CONVERTER(zeek::TYPE_LIST, ListVal*, AsListVal) - CONST_CONVERTER(zeek::TYPE_STRING, StringVal*, AsStringVal) - CONST_CONVERTER(zeek::TYPE_VECTOR, VectorVal*, AsVectorVal) - CONST_CONVERTER(zeek::TYPE_OPAQUE, OpaqueVal*, AsOpaqueVal) + AddrVal* AsAddrVal(); + const AddrVal* AsAddrVal() const; + + TableVal* AsTableVal(); + const TableVal* AsTableVal() const; + + RecordVal* AsRecordVal(); + const RecordVal* AsRecordVal() const; + + ListVal* AsListVal(); + const ListVal* AsListVal() const; + + StringVal* AsStringVal(); + const StringVal* AsStringVal() const; + + VectorVal* AsVectorVal(); + const VectorVal* AsVectorVal() const; + + EnumVal* AsEnumVal(); + const EnumVal* AsEnumVal() const; + + OpaqueVal* AsOpaqueVal(); + const OpaqueVal* AsOpaqueVal() const; void Describe(ODesc* d) const override; virtual void DescribeReST(ODesc* d) const;