Jelajahi Sumber

Fixed segmentation fault in script engine when calling something which is not a function

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@7971 54d463be-8e91-2dee-dedb-b68131a5f0ec
toms 19 tahun lalu
induk
melakukan
685a894908
2 mengubah file dengan 15 tambahan dan 13 penghapusan
  1. 1 0
      Changelog-Trunk.txt
  2. 14 13
      src/map/script.c

+ 1 - 0
Changelog-Trunk.txt

@@ -4,6 +4,7 @@ AS OF SVN REV. 5091, WE ARE NOW USING TRUNK.  ALL UNTESTED BUGFIXES/FEATURES GO
 IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
 
 2006/07/29
+	* Fixed segmentation fault in script engine when calling something which is not a function [Toms]
 	* Fixed segmentation fault in script engine when activating DEBUG_RUN flag [Toms]
 2006/07/28
 	* Added Ishizu's code to check ammo type on attack. No more using Grenade

+ 14 - 13
src/map/script.c

@@ -2458,7 +2458,20 @@ int run_func(struct script_state *st)
 	int i,start_sp,end_sp,func;
 
 	end_sp=st->stack->sp;
+	for(i=end_sp-1;i>=0 && st->stack->stack_data[i].type!=C_ARG;i--);
+	if(i==0){
+		if(battle_config.error_log)
+			ShowError("function not found\n");
+//		st->stack->sp=0;
+		st->state=END;
+		report_src(st);
+		return 1;
+	}
+	start_sp=i-1;
+	st->start=i-1;
+	st->end=end_sp;
 	func=st->stack->stack_data[st->start].u.num;
+
 #ifdef DEBUG_RUN
 	if(battle_config.etc_log) {
 		ShowDebug("run_func : %s? (%d(%d)) sp=%d (%d...%d)\n",str_buf+str_data[func].str, func, str_data[func].type, st->stack->sp, st->start, st->end);
@@ -2490,21 +2503,9 @@ int run_func(struct script_state *st)
 		printf("\n");
 	}
 #endif
-	for(i=end_sp-1;i>=0 && st->stack->stack_data[i].type!=C_ARG;i--);
-	if(i==0){
-		if(battle_config.error_log)
-			ShowError("function not found\n");
-//		st->stack->sp=0;
-		st->state=END;
-		report_src(st);
-		return 1;
-	}
-	start_sp=i-1;
-	st->start=i-1;
-	st->end=end_sp;
 
 	if(str_data[func].type!=C_FUNC ){
-		ShowMessage ("run_func: '"CL_WHITE"%s"CL_RESET"' (type %d) is not function and command!\n");
+		ShowMessage ("run_func: '"CL_WHITE"%s"CL_RESET"' (type %d) is not function and command!\n", str_buf+str_data[func].str, str_data[func].type);
 //		st->stack->sp=0;
 		st->state=END;
 		report_src(st);