diff --git a/CHANGES b/CHANGES index 2a1f852e09..7e15f7b707 100644 --- a/CHANGES +++ b/CHANGES @@ -1,4 +1,12 @@ +2.3-693 | 2015-04-11 10:56:31 -0700 + + * BIT-1367: improve coercion of anonymous records in set constructor. + (Jon Siwek) + + * Allow to specify ports for sftp log rotator. (Johanna Amann) + + 2.3-690 | 2015-04-10 21:51:10 -0700 * Make sure to always delete the remote serializer. Addresses diff --git a/VERSION b/VERSION index eb1820b417..0cb2197cc6 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.3-690 +2.3-693 diff --git a/scripts/base/frameworks/logging/postprocessors/sftp.bro b/scripts/base/frameworks/logging/postprocessors/sftp.bro index b7f6827026..8c77899864 100644 --- a/scripts/base/frameworks/logging/postprocessors/sftp.bro +++ b/scripts/base/frameworks/logging/postprocessors/sftp.bro @@ -37,6 +37,8 @@ export { user: string; ## The remote host to which to transfer logs. host: string; + ## The port to connect to. Defaults to 22 + host_port: count &default=22; ## The path/directory on the remote host to send logs. path: string; }; @@ -63,8 +65,8 @@ function sftp_postprocessor(info: Log::RotationInfo): bool { local dst = fmt("%s/%s.%s.log", d$path, info$path, strftime(Log::sftp_rotation_date_format, info$open)); - command += fmt("echo put %s %s | sftp -b - %s@%s;", info$fname, dst, - d$user, d$host); + command += fmt("echo put %s %s | sftp -P %d -b - %s@%s;", info$fname, dst, + d$host_port, d$user, d$host); } command += fmt("/bin/rm %s", info$fname); diff --git a/src/Expr.cc b/src/Expr.cc index d2dcb1585b..049c0981dd 100644 --- a/src/Expr.cc +++ b/src/Expr.cc @@ -2599,6 +2599,39 @@ bool AssignExpr::TypeCheck(attr_list* attrs) if ( ! same_type(op1->Type(), op2->Type()) ) { + if ( bt1 == TYPE_TABLE && bt2 == TYPE_TABLE ) + { + if ( op2->Tag() == EXPR_SET_CONSTRUCTOR ) + { + // Some elements in constructor list must not match, see if + // we can create a new constructor now that the expected type + // of LHS is known and let it do coercions where possible. + SetConstructorExpr* sce = dynamic_cast(op2); + ListExpr* ctor_list = dynamic_cast(sce->Op()); + attr_list* attr_copy = 0; + + if ( sce->Attrs() ) + { + attr_list* a = sce->Attrs()->Attrs(); + attrs = new attr_list; + loop_over_list(*a, i) + attrs->append((*a)[i]); + } + + int errors_before = reporter->Errors(); + op2 = new SetConstructorExpr(ctor_list, attr_copy, op1->Type()); + int errors_after = reporter->Errors(); + + if ( errors_after > errors_before ) + { + ExprError("type clash in assignment"); + return false; + } + + return true; + } + } + ExprError("type clash in assignment"); return false; } diff --git a/testing/btest/Baseline/language.set-type-checking/out b/testing/btest/Baseline/language.set-type-checking/out index d93db19abd..707363e9c8 100644 --- a/testing/btest/Baseline/language.set-type-checking/out +++ b/testing/btest/Baseline/language.set-type-checking/out @@ -18,4 +18,7 @@ error in /Users/jsiwek/Projects/bro/bro/testing/btest/.tmp/language.set-type-che error in port and /Users/jsiwek/Projects/bro/bro/testing/btest/.tmp/language.set-type-checking/set-type-checking.bro, line 38: arithmetic mixed with non-arithmetic (port and 1002) error in /Users/jsiwek/Projects/bro/bro/testing/btest/.tmp/language.set-type-checking/set-type-checking.bro, line 38 and port: type mismatch (1002 and port) error in /Users/jsiwek/Projects/bro/bro/testing/btest/.tmp/language.set-type-checking/set-type-checking.bro, line 38: inconsistent type in set constructor (set(1002)) +error in port and /Users/jsiwek/Projects/bro/bro/testing/btest/.tmp/language.set-type-checking/set-type-checking.bro, line 44: arithmetic mixed with non-arithmetic (port and 1003) +error in /Users/jsiwek/Projects/bro/bro/testing/btest/.tmp/language.set-type-checking/set-type-checking.bro, line 44 and port: type mismatch (1003 and port) +error in /Users/jsiwek/Projects/bro/bro/testing/btest/.tmp/language.set-type-checking/set-type-checking.bro, line 44: inconsistent type in set constructor (set(1003)) error in /Users/jsiwek/Projects/bro/bro/testing/btest/.tmp/language.set-type-checking/set-type-checking.bro, line 44: type clash in assignment (lea = set(1003)) diff --git a/testing/btest/language/set-type-checking.bro b/testing/btest/language/set-type-checking.bro index bf774fb9f9..3c82a29730 100644 --- a/testing/btest/language/set-type-checking.bro +++ b/testing/btest/language/set-type-checking.bro @@ -43,3 +43,18 @@ event bro_init() { local lea: MySet = set(1003); # type clash } + +type MyRecord: record { + user: string; + host: string; + host_port: count &default=22; + path: string; +}; + +global set_of_records: set[MyRecord]; + +event bro_init() + { + # Set ctor w/ anonymous record ctor should coerce. + set_of_records = set([$user="testuser", $host="testhost", $path="testpath"]); + }