diff --git a/src/Func.cc b/src/Func.cc index e9933a6a6a..791a3b820e 100644 --- a/src/Func.cc +++ b/src/Func.cc @@ -449,6 +449,11 @@ void BroFunc::AddBody(IntrusivePtr new_body, id_list* new_inits, if ( new_frame_size > frame_size ) frame_size = new_frame_size; + auto num_args = FType()->Args()->NumFields(); + + if ( num_args > static_cast(frame_size) ) + frame_size = num_args; + new_body = AddInits(std::move(new_body), new_inits); if ( Flavor() == FUNC_FLAVOR_FUNCTION ) diff --git a/testing/btest/Baseline/language.alternate-event-hook-prototypes/out b/testing/btest/Baseline/language.alternate-event-hook-prototypes/out index 8aad989b3d..aa70ccc747 100644 --- a/testing/btest/Baseline/language.alternate-event-hook-prototypes/out +++ b/testing/btest/Baseline/language.alternate-event-hook-prototypes/out @@ -1,4 +1,4 @@ -warning in /home/jon/pro/zeek/zeek/testing/btest/.tmp/language.alternate-event-hook-prototypes/alternate-event-hook-prototypes.zeek, line 56 and /home/jon/pro/zeek/zeek/testing/btest/.tmp/language.alternate-event-hook-prototypes/alternate-event-hook-prototypes.zeek, line 10: use of deprecated prototype (hook(c:count;) : bool and my_hook) +warning in /home/jon/pro/zeek/zeek/testing/btest/.tmp/language.alternate-event-hook-prototypes/alternate-event-hook-prototypes.zeek, line 68 and /home/jon/pro/zeek/zeek/testing/btest/.tmp/language.alternate-event-hook-prototypes/alternate-event-hook-prototypes.zeek, line 10: use of deprecated prototype (hook(c:count;) : bool and my_hook) my_hook, infinite, 13 my_hook, 13, infinite my_hook, infinite @@ -9,3 +9,4 @@ my_event, 42, enantiodromia my_event, enantiodromia my_event, 42 my_event +foo, C diff --git a/testing/btest/language/alternate-event-hook-prototypes.zeek b/testing/btest/language/alternate-event-hook-prototypes.zeek index e58c542b99..62573479d6 100644 --- a/testing/btest/language/alternate-event-hook-prototypes.zeek +++ b/testing/btest/language/alternate-event-hook-prototypes.zeek @@ -13,6 +13,18 @@ global my_hook: hook(s: string); global my_hook: hook(c: count) &deprecated; global my_hook: hook(); +# Required Frame size gets (re)calculated on AddBody, so this "foo" setup is +# checking that if the only existing body doesn't use all arguments, the Frame +# size is still allocated sufficiently to hold all arguments of the canonical +# prototype. +global foo: event(a: string, b: string, c: string); +global foo: event(c: string); + +event foo(c: string) + { + print "foo", c; + } + event my_event(s: string, c: count) { print "my_event", s, c; @@ -67,4 +79,5 @@ event zeek_init() { hook my_hook("infinite", 13); event my_event("enantiodromia", 42); + event foo("A", "B", "C"); }