Fixed a newly introduced stack bug

Fixes #4537

Thanks to @Triedge
This commit is contained in:
Lemongrass3110 2020-01-14 09:47:28 +01:00
parent e72c7360cf
commit 8f512d8abb

View File

@ -2869,7 +2869,8 @@ const char* get_val2_str( struct script_state* st, int64 uid, struct reg_db* ref
value = data->u.str; value = data->u.str;
} }
script_removetop( st, -1, 0 ); // Do NOT remove the value from stack here, the pointer is returned here and will be used by the caller [Lemongrass]
// script_removetop( st, -1, 0 );
return value; return value;
} }
@ -2913,6 +2914,8 @@ void script_array_ensure_zero(struct script_state *st, struct map_session_data *
const char* str = get_val2_str( st, uid, ref ); const char* str = get_val2_str( st, uid, ref );
if( str && *str ) if( str && *str )
insert = true; insert = true;
// Remove stack entry from get_val2_str
script_removetop( st, -1, 0 );
} else { } else {
int64 num = get_val2_num( st, uid, ref ); int64 num = get_val2_num( st, uid, ref );
if( num ) if( num )
@ -6315,6 +6318,8 @@ BUILDIN_FUNC(copyarray)
if( is_string ){ if( is_string ){
const char* value = get_val2_str( st, reference_uid( id2, idx2 + i ), reference_getref( data2 ) ); const char* value = get_val2_str( st, reference_uid( id2, idx2 + i ), reference_getref( data2 ) );
set_reg_str( st, sd, reference_uid( id1, idx1 + i ), name1, value, reference_getref( data1 ) ); set_reg_str( st, sd, reference_uid( id1, idx1 + i ), name1, value, reference_getref( data1 ) );
// Remove stack entry from get_val2_str
script_removetop( st, -1, 0 );
}else{ }else{
int64 value = get_val2_num( st, reference_uid( id2, idx2 + i ), reference_getref( data2 ) ); int64 value = get_val2_num( st, reference_uid( id2, idx2 + i ), reference_getref( data2 ) );
set_reg_num( st, sd, reference_uid( id1, idx1 + i ), name1, value, reference_getref( data1 ) ); set_reg_num( st, sd, reference_uid( id1, idx1 + i ), name1, value, reference_getref( data1 ) );
@ -6327,6 +6332,8 @@ BUILDIN_FUNC(copyarray)
if( is_string ){ if( is_string ){
const char* value = get_val2_str( st, reference_uid( id2, idx2 + i ), reference_getref( data2 ) ); const char* value = get_val2_str( st, reference_uid( id2, idx2 + i ), reference_getref( data2 ) );
set_reg_str( st, sd, reference_uid( id1, idx1 + i ), name1, value, reference_getref( data1 ) ); set_reg_str( st, sd, reference_uid( id1, idx1 + i ), name1, value, reference_getref( data1 ) );
// Remove stack entry from get_val2_str
script_removetop( st, -1, 0 );
}else{ }else{
int64 value = get_val2_num( st, reference_uid( id2, idx2 + i ), reference_getref( data2 ) ); int64 value = get_val2_num( st, reference_uid( id2, idx2 + i ), reference_getref( data2 ) );
set_reg_num( st, sd, reference_uid( id1, idx1 + i ), name1, value, reference_getref( data1 ) ); set_reg_num( st, sd, reference_uid( id1, idx1 + i ), name1, value, reference_getref( data1 ) );
@ -6442,6 +6449,8 @@ BUILDIN_FUNC(deletearray)
if( is_string ){ if( is_string ){
const char* value = get_val2_str( st, reference_uid( id, start + count ), reference_getref( data ) ); const char* value = get_val2_str( st, reference_uid( id, start + count ), reference_getref( data ) );
set_reg_str( st, sd, reference_uid( id, start ), name, value, reference_getref( data ) ); set_reg_str( st, sd, reference_uid( id, start ), name, value, reference_getref( data ) );
// Remove stack entry from get_val2_str
script_removetop( st, -1, 0 );
}else{ }else{
int64 value = get_val2_num( st, reference_uid( id, start + count ), reference_getref( data ) ); int64 value = get_val2_num( st, reference_uid( id, start + count ), reference_getref( data ) );
set_reg_num( st, sd, reference_uid( id, start ), name, value, reference_getref( data ) ); set_reg_num( st, sd, reference_uid( id, start ), name, value, reference_getref( data ) );
@ -6470,6 +6479,8 @@ BUILDIN_FUNC(deletearray)
if( is_string ){ if( is_string ){
const char* value = get_val2_str( st, reference_uid( id, list[i] ), reference_getref( data ) ); const char* value = get_val2_str( st, reference_uid( id, list[i] ), reference_getref( data ) );
set_reg_str( st, sd, reference_uid( id, list[i] - count ), name, value, reference_getref( data ) ); set_reg_str( st, sd, reference_uid( id, list[i] - count ), name, value, reference_getref( data ) );
// Remove stack entry from get_val2_str
script_removetop( st, -1, 0 );
}else{ }else{
int64 value = get_val2_num( st, reference_uid( id, list[i] ), reference_getref( data ) ); int64 value = get_val2_num( st, reference_uid( id, list[i] ), reference_getref( data ) );
set_reg_num( st, sd, reference_uid( id, list[i] - count ), name, value, reference_getref( data ) ); set_reg_num( st, sd, reference_uid( id, list[i] - count ), name, value, reference_getref( data ) );
@ -6580,9 +6591,14 @@ BUILDIN_FUNC(inarray)
const char* temp = get_val2_str( st, reference_uid( id, i ), ref ); const char* temp = get_val2_str( st, reference_uid( id, i ), ref );
if( !strcmp( temp, value ) ){ if( !strcmp( temp, value ) ){
// Remove stack entry from get_val2_str
script_removetop( st, -1, 0 );
script_pushint( st, i ); script_pushint( st, i );
return SCRIPT_CMD_SUCCESS; return SCRIPT_CMD_SUCCESS;
} }
// Remove stack entry from get_val2_str
script_removetop( st, -1, 0 );
} }
}else{ }else{
int64 value = script_getnum64( st, 3 ); int64 value = script_getnum64( st, 3 );
@ -6675,7 +6691,13 @@ BUILDIN_FUNC(countinarray)
if( !strcmp( temp1, temp2 ) ){ if( !strcmp( temp1, temp2 ) ){
case_count++; case_count++;
} }
// Remove stack entry from get_val2_str
script_removetop( st, -1, 0 );
} }
// Remove stack entry from get_val2_str
script_removetop( st, -1, 0 );
} }
}else if( !is_string_variable( name1 ) && !is_string_variable( name2 ) ){ }else if( !is_string_variable( name1 ) && !is_string_variable( name2 ) ){
for( ; i <= array_size1; ++i ){ for( ; i <= array_size1; ++i ){
@ -16103,6 +16125,8 @@ BUILDIN_FUNC(implode)
for(i = 0; i <= array_size; ++i) { for(i = 0; i <= array_size; ++i) {
temp = get_val2_str( st, reference_uid( id, i ), reference_getref( data ) ); temp = get_val2_str( st, reference_uid( id, i ), reference_getref( data ) );
len += strlen(temp); len += strlen(temp);
// Remove stack entry from get_val2_str
script_removetop( st, -1, 0 );
} }
//allocate mem //allocate mem
@ -16119,6 +16143,8 @@ BUILDIN_FUNC(implode)
len = strlen(temp); len = strlen(temp);
memcpy(&output[k], temp, len); memcpy(&output[k], temp, len);
k += len; k += len;
// Remove stack entry from get_val2_str
script_removetop( st, -1, 0 );
if(glue_len != 0) { if(glue_len != 0) {
memcpy(&output[k], glue, glue_len); memcpy(&output[k], glue, glue_len);
@ -16131,6 +16157,8 @@ BUILDIN_FUNC(implode)
memcpy(&output[k], temp, len); memcpy(&output[k], temp, len);
k += len; k += len;
output[k] = '\0'; output[k] = '\0';
// Remove stack entry from get_val2_str
script_removetop( st, -1, 0 );
} }
script_pushstr(st, output); script_pushstr(st, output);