فهرست منبع

Fix makeVarArgs cast to func and call as dyn segfault (#755)

Yuxiao Mao 6 ماه پیش
والد
کامیت
ea9ce91980
1فایلهای تغییر یافته به همراه4 افزوده شده و 1 حذف شده
  1. 4 1
      src/std/fun.c

+ 4 - 1
src/std/fun.c

@@ -149,6 +149,9 @@ HL_PRIM vdynamic* hl_call_method( vdynamic *c, varray *args ) {
 	if( args->size > HL_MAX_ARGS )
 	if( args->size > HL_MAX_ARGS )
 		hl_error("Too many arguments");
 		hl_error("Too many arguments");
 	if( cl->hasValue ) {
 	if( cl->hasValue ) {
+		if( cl->hasValue == 2 ) {
+			cl = ((vclosure_wrapper*)cl)->wrappedFun;
+		}
 		if( cl->fun == fun_var_args ) {
 		if( cl->fun == fun_var_args ) {
 			cl = (vclosure*)cl->value;
 			cl = (vclosure*)cl->value;
 			return cl->hasValue ? ((vdynamic* (*)(vdynamic*, varray*))cl->fun)(cl->value, args) : ((vdynamic* (*)(varray*))cl->fun)(args);
 			return cl->hasValue ? ((vdynamic* (*)(vdynamic*, varray*))cl->fun)(cl->value, args) : ((vdynamic* (*)(varray*))cl->fun)(args);
@@ -228,7 +231,7 @@ HL_PRIM vdynamic *hl_dyn_call( vclosure *c, vdynamic **args, int nargs ) {
 	tmp.a.t = &hlt_array;
 	tmp.a.t = &hlt_array;
 	tmp.a.at = &hlt_dyn;
 	tmp.a.at = &hlt_dyn;
 	tmp.a.size = nargs;
 	tmp.a.size = nargs;
-	if( c->hasValue && c->t->fun->nargs >= 0 ) {
+	if( c->hasValue && c->t->fun->nargs >= 0 && c->t->fun->parent != NULL ) {
 		ctmp.t = c->t->fun->parent;
 		ctmp.t = c->t->fun->parent;
 		ctmp.hasValue = 0;
 		ctmp.hasValue = 0;
 		ctmp.fun = c->fun;
 		ctmp.fun = c->fun;