summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHaru <haru@dotalux.com>2016-07-05 02:02:56 +0200
committerGitHub <noreply@github.com>2016-07-05 02:02:56 +0200
commit5f5ef66b14ad74bbf10b01212825cb537c872623 (patch)
treeea80e4b6344fb5413b49ecd47e33b308a95d7176
parent5ee87b37287e73088102cb824354e8ccd98580f3 (diff)
parentd5baa8a68e3bb65681c0168920a461b2675d2dfd (diff)
downloadhercules-5f5ef66b14ad74bbf10b01212825cb537c872623.tar.gz
hercules-5f5ef66b14ad74bbf10b01212825cb537c872623.tar.bz2
hercules-5f5ef66b14ad74bbf10b01212825cb537c872623.tar.xz
hercules-5f5ef66b14ad74bbf10b01212825cb537c872623.zip
Merge pull request #1339 from 4144/scriptchecks
Add one check for possible script issue.
-rw-r--r--src/map/script.c18
-rw-r--r--src/map/script.h2
2 files changed, 16 insertions, 4 deletions
diff --git a/src/map/script.c b/src/map/script.c
index 12f7dd43c..ed38ed1c5 100644
--- a/src/map/script.c
+++ b/src/map/script.c
@@ -4042,10 +4042,17 @@ void op_1(struct script_state* st, int op)
///
/// @param st Script state whose stack arguments should be inspected.
/// @param func Built-in function for which the arguments are intended.
-void script_check_buildin_argtype(struct script_state* st, int func)
+bool script_check_buildin_argtype(struct script_state* st, int func)
{
int idx, invalid = 0;
- char* sf = script->buildin[script->str_data[func].val];
+ char* sf;
+ if (script->str_data[func].val < 0 || script->str_data[func].val >= script->buildin_count) {
+ ShowDebug("Function: %s\n", script->get_str(func));
+ ShowError("Script data corruption detected!\n");
+ script->reportsrc(st);
+ return false;
+ }
+ sf = script->buildin[script->str_data[func].val];
for (idx = 2; script_hasdata(st, idx); idx++) {
struct script_data* data = script_getdata(st, idx);
@@ -4116,6 +4123,7 @@ void script_check_buildin_argtype(struct script_state* st, int func)
ShowDebug("Function: %s\n", script->get_str(func));
script->reportsrc(st);
}
+ return true;
}
/// Executes a buildin command.
@@ -4153,7 +4161,11 @@ int run_func(struct script_state *st)
}
if( script->config.warn_func_mismatch_argtypes ) {
- script->check_buildin_argtype(st, func);
+ if (script->check_buildin_argtype(st, func) == false)
+ {
+ st->state = END;
+ return 1;
+ }
}
if(script->str_data[func].func) {
diff --git a/src/map/script.h b/src/map/script.h
index 61c6a4583..4df8941b7 100644
--- a/src/map/script.h
+++ b/src/map/script.h
@@ -758,7 +758,7 @@ struct script_interface {
void (*op_2num) (struct script_state *st, int op, int i1, int i2);
void (*op_2) (struct script_state *st, int op);
void (*op_1) (struct script_state *st, int op);
- void (*check_buildin_argtype) (struct script_state *st, int func);
+ bool (*check_buildin_argtype) (struct script_state *st, int func);
void (*detach_state) (struct script_state *st, bool dequeue_event);
int (*db_free_code_sub) (union DBKey key, struct DBData *data, va_list ap);
void (*add_autobonus) (const char *autobonus);