diff options
author | greenboxal2 <greenboxal2@54d463be-8e91-2dee-dedb-b68131a5f0ec> | 2012-05-04 23:17:25 +0000 |
---|---|---|
committer | greenboxal2 <greenboxal2@54d463be-8e91-2dee-dedb-b68131a5f0ec> | 2012-05-04 23:17:25 +0000 |
commit | 2669e9a01c53528c8bdadfe32d0a452ac4d48942 (patch) | |
tree | 6cb8b884bbf0ab7e481da420a6b022980b9a2acd | |
parent | a7ea318bbf7feb5f7d1ffa9292b23a16c8a3be87 (diff) | |
download | hercules-2669e9a01c53528c8bdadfe32d0a452ac4d48942.tar.gz hercules-2669e9a01c53528c8bdadfe32d0a452ac4d48942.tar.bz2 hercules-2669e9a01c53528c8bdadfe32d0a452ac4d48942.tar.xz hercules-2669e9a01c53528c8bdadfe32d0a452ac4d48942.zip |
Fix bugreport:5695 local scoped variables reference map not being freed after return.
git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@16079 54d463be-8e91-2dee-dedb-b68131a5f0ec
-rw-r--r-- | src/map/script.c | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/src/map/script.c b/src/map/script.c index 26d88ea17..4ca65a02a 100644 --- a/src/map/script.c +++ b/src/map/script.c @@ -2872,13 +2872,13 @@ struct script_data* push_str(struct script_stack* stack, enum c_op type, char* s } /// Pushes a retinfo into the stack -struct script_data* push_retinfo(struct script_stack* stack, struct script_retinfo* ri) +struct script_data* push_retinfo(struct script_stack* stack, struct script_retinfo* ri, DBMap **ref) { if( stack->sp >= stack->sp_max ) stack_expand(stack); stack->stack_data[stack->sp].type = C_RETINFO; stack->stack_data[stack->sp].u.ri = ri; - stack->stack_data[stack->sp].ref = NULL; + stack->stack_data[stack->sp].ref = ref; stack->sp++; return &stack->stack_data[stack->sp-1]; } @@ -4454,6 +4454,7 @@ BUILDIN_FUNC(callfunc) struct script_retinfo* ri; struct script_code* scr; const char* str = script_getstr(st,2); + DBMap **ref = NULL; scr = (struct script_code*)strdb_get(userfunc_db, str); if( !scr ) @@ -4470,8 +4471,11 @@ BUILDIN_FUNC(callfunc) { const char* name = reference_getname(data); if( name[0] == '.' ) { - data->ref = (struct DBMap**)aCalloc(sizeof(struct DBMap*), 1); - data->ref[0] = (name[1] == '@' ? st->stack->var_function : st->script->script_vars); + if ( !ref ) { + ref = (struct DBMap**)aCalloc(sizeof(struct DBMap*), 1); + ref[0] = (name[1] == '@' ? st->stack->var_function : st->script->script_vars); + } + data->ref = ref; } } } @@ -4482,7 +4486,7 @@ BUILDIN_FUNC(callfunc) ri->pos = st->pos;// script location ri->nargs = j;// argument count ri->defsp = st->stack->defsp;// default stack pointer - push_retinfo(st->stack, ri); + push_retinfo(st->stack, ri, ref); st->pos = 0; st->script = scr; @@ -4500,6 +4504,7 @@ BUILDIN_FUNC(callsub) int i,j; struct script_retinfo* ri; int pos = script_getnum(st,2); + DBMap **ref = NULL; if( !data_islabel(script_getdata(st,2)) && !data_isfunclabel(script_getdata(st,2)) ) { @@ -4516,8 +4521,11 @@ BUILDIN_FUNC(callsub) { const char* name = reference_getname(data); if( name[0] == '.' && name[1] == '@' ) { - data->ref = (struct DBMap**)aCalloc(sizeof(struct DBMap*), 1); - data->ref[0] = st->stack->var_function; + if ( !ref ) { + ref = (struct DBMap**)aCalloc(sizeof(struct DBMap*), 1); + ref[0] = st->stack->var_function; + } + data->ref = ref; } } } @@ -4528,7 +4536,7 @@ BUILDIN_FUNC(callsub) ri->pos = st->pos;// script location ri->nargs = j;// argument count ri->defsp = st->stack->defsp;// default stack pointer - push_retinfo(st->stack, ri); + push_retinfo(st->stack, ri, ref); st->pos = pos; st->stack->defsp = st->stack->sp; |