bugfix for very long code values - allow for any length

This commit is contained in:
Sven 2018-08-04 13:05:05 -04:00
parent deff1de2b7
commit 2fb5d54130
6 changed files with 77 additions and 18 deletions

View File

@ -233,6 +233,16 @@ bool cheat_manager_copy_idx_to_working(unsigned idx)
}
memcpy(&(cheat_manager_state.working_cheat), &(cheat_manager_state.cheats[idx]), sizeof(struct item_cheat)) ;
if ( cheat_manager_state.cheats[idx].desc != NULL )
strlcpy(cheat_manager_state.working_desc, cheat_manager_state.cheats[idx].desc, CHEAT_DESC_SCRATCH_SIZE) ;
else
cheat_manager_state.working_desc[0] = '\0' ;
if ( cheat_manager_state.cheats[idx].code != NULL )
strlcpy(cheat_manager_state.working_code, cheat_manager_state.cheats[idx].code, CHEAT_CODE_SCRATCH_SIZE) ;
else
cheat_manager_state.working_code[0] = '\0' ;
return true ;
}
bool cheat_manager_copy_working_to_idx(unsigned idx)
@ -243,6 +253,10 @@ bool cheat_manager_copy_working_to_idx(unsigned idx)
}
memcpy(&(cheat_manager_state.cheats[idx]), &(cheat_manager_state.working_cheat), sizeof(struct item_cheat)) ;
if ( cheat_manager_state.cheats[idx].desc != NULL )
free(cheat_manager_state.cheats[idx].desc) ;
cheat_manager_state.cheats[idx].desc = strdup(cheat_manager_state.working_desc) ;
return true ;
}
static void cheat_manager_new(unsigned size)
@ -268,8 +282,8 @@ static void cheat_manager_new(unsigned size)
for (i = 0; i < cheat_manager_state.size; i++)
{
cheat_manager_state.cheats[i].desc[0] = 0 ;
cheat_manager_state.cheats[i].code[0] = 0 ;
cheat_manager_state.cheats[i].desc = NULL ;
cheat_manager_state.cheats[i].code = NULL ;
cheat_manager_state.cheats[i].state = false;
}
@ -362,16 +376,16 @@ bool cheat_manager_load(const char *path, bool append)
cheat_manager_state.cheats[i].idx = i ;
cheat_manager_state.cheats[i].desc[0] = 0 ;
cheat_manager_state.cheats[i].code[0] = 0 ;
cheat_manager_state.cheats[i].desc = NULL ;
cheat_manager_state.cheats[i].code = NULL ;
cheat_manager_state.cheats[i].state = false ;
cheat_manager_state.cheats[i].big_endian = false ;
if (config_get_string(conf, desc_key, &tmp) && !string_is_empty(tmp))
strcpy(cheat_manager_state.cheats[i].desc,tmp) ;
cheat_manager_state.cheats[i].desc = strdup(tmp) ;
if (config_get_string(conf, code_key, &tmp) && !string_is_empty(tmp))
strcpy(cheat_manager_state.cheats[i].code,tmp) ;
cheat_manager_state.cheats[i].code = strdup(tmp) ;
if (config_get_bool(conf, enable_key, &tmp_bool))
cheat_manager_state.cheats[i].state = tmp_bool;
@ -420,6 +434,16 @@ bool cheat_manager_realloc(unsigned new_size, unsigned default_handler)
else
{
orig_size = cheat_manager_state.size ;
/* if size is decreasing, free the items that will be lost */
for (i = new_size; i < orig_size; i++)
{
if ( cheat_manager_state.cheats[i].code != NULL )
free(cheat_manager_state.cheats[i].code) ;
if ( cheat_manager_state.cheats[i].desc != NULL )
free(cheat_manager_state.cheats[i].desc) ;
}
cheat_manager_state.cheats = (struct item_cheat*)
realloc(cheat_manager_state.cheats, new_size * sizeof(struct item_cheat));
}
@ -449,8 +473,20 @@ bool cheat_manager_realloc(unsigned new_size, unsigned default_handler)
void cheat_manager_free(void)
{
unsigned i = 0 ;
if (cheat_manager_state.cheats)
{
for (i = 0; i < cheat_manager_state.size; i++)
{
if ( cheat_manager_state.cheats[i].desc != NULL )
free(cheat_manager_state.cheats[i].desc) ;
if ( cheat_manager_state.cheats[i].code != NULL )
free(cheat_manager_state.cheats[i].code) ;
}
free(cheat_manager_state.cheats);
}
if ( cheat_manager_state.prev_memory_buf )
free(cheat_manager_state.prev_memory_buf) ;
@ -480,7 +516,7 @@ void cheat_manager_update(cheat_manager_t *handle, unsigned handle_idx)
snprintf(msg, sizeof(msg), "Cheat: #%u [%s]: %s",
handle_idx, handle->cheats[handle_idx].state ? "ON" : "OFF",
(handle->cheats[handle_idx].desc[0]) ?
(handle->cheats[handle_idx].desc!=NULL) ?
(handle->cheats[handle_idx].desc) : (handle->cheats[handle_idx].code)
);
runloop_msg_queue_push(msg, 1, 180, true);

View File

@ -76,15 +76,15 @@ enum cheat_rumble_type
RUMBLE_TYPE_GT_VALUE
};
#define CHEAT_CODE_SIZE 200
#define CHEAT_DESC_SIZE 100
#define CHEAT_CODE_SCRATCH_SIZE 100
#define CHEAT_DESC_SCRATCH_SIZE 255
struct item_cheat
{
unsigned int idx;
char desc[CHEAT_DESC_SIZE];
char *desc;
bool state;
char code[CHEAT_CODE_SIZE];
char *code;
unsigned int handler ;
/* Number of bits = 2^memory_search_size
* 0=1, 1=2, 2=4, 3=8, 4=16, 5=32
@ -154,6 +154,8 @@ struct cheat_manager
bool memory_search_initialized ;
unsigned int delete_state ;
unsigned browse_address;
char working_desc[CHEAT_DESC_SCRATCH_SIZE] ;
char working_code[CHEAT_CODE_SCRATCH_SIZE] ;
};
typedef struct cheat_manager cheat_manager_t;

View File

@ -1887,7 +1887,8 @@ static void menu_action_setting_disp_set_label_setting_string(file_list_t* list,
*w = 19;
strlcpy(s, setting->value.target.string, len);
if ( setting->value.target.string != NULL )
strlcpy(s, setting->value.target.string, len);
strlcpy(s2, path, len2);
}

View File

@ -2818,6 +2818,10 @@ static int action_ok_cheat_copy_before(const char *path,
memcpy(&tmp, &cheat_manager_state.cheats[cheat_manager_state.working_cheat.idx], sizeof(struct item_cheat )) ;
tmp.idx = cheat_manager_state.working_cheat.idx ;
if ( tmp.code != NULL )
tmp.code = strdup(tmp.code) ;
if ( tmp.desc != NULL )
tmp.desc = strdup(tmp.desc) ;
for (i = cheat_manager_state.size-2 ; i >=(int)tmp.idx ; i--)
{
@ -2853,6 +2857,10 @@ static int action_ok_cheat_copy_after(const char *path,
memcpy(&tmp, &cheat_manager_state.cheats[cheat_manager_state.working_cheat.idx], sizeof(struct item_cheat )) ;
tmp.idx = cheat_manager_state.working_cheat.idx+1 ;
if ( tmp.code != NULL )
tmp.code = strdup(tmp.code) ;
if ( tmp.desc != NULL )
tmp.desc = strdup(tmp.desc) ;
for (i = cheat_manager_state.size-2 ; i >= (int)(cheat_manager_state.working_cheat.idx+1); i--)
{
@ -2884,11 +2892,23 @@ static int action_ok_cheat_delete(const char *path,
if( new_size >0 )
{
unsigned i;
if ( cheat_manager_state.cheats[cheat_manager_state.working_cheat.idx].code != NULL )
{
free(cheat_manager_state.cheats[cheat_manager_state.working_cheat.idx].code) ;
cheat_manager_state.cheats[cheat_manager_state.working_cheat.idx].code = NULL ;
}
if ( cheat_manager_state.cheats[cheat_manager_state.working_cheat.idx].desc != NULL )
{
free(cheat_manager_state.cheats[cheat_manager_state.working_cheat.idx].desc) ;
cheat_manager_state.cheats[cheat_manager_state.working_cheat.idx].desc = NULL ;
}
for (i = cheat_manager_state.working_cheat.idx ; i <cheat_manager_state.size-1 ; i++)
{
memcpy(&cheat_manager_state.cheats[i], &cheat_manager_state.cheats[i+1], sizeof(struct item_cheat )) ;
cheat_manager_state.cheats[i].idx-- ;
}
cheat_manager_state.cheats[cheat_manager_state.size-1].code = NULL ;
cheat_manager_state.cheats[cheat_manager_state.size-1].desc = NULL ;
}
cheat_manager_realloc(new_size, CHEAT_HANDLER_TYPE_RETRO);

View File

@ -3375,8 +3375,8 @@ static bool setting_append_list(
CONFIG_STRING(
list, list_info,
cheat_manager_state.working_cheat.desc,
sizeof(cheat_manager_state.working_cheat.desc),
cheat_manager_state.working_desc,
sizeof(cheat_manager_state.working_desc),
MENU_ENUM_LABEL_CHEAT_DESC,
MENU_ENUM_LABEL_VALUE_CHEAT_DESC,
"",
@ -3394,8 +3394,8 @@ static bool setting_append_list(
CONFIG_STRING(
list, list_info,
cheat_manager_state.working_cheat.code,
sizeof(cheat_manager_state.working_cheat.code),
cheat_manager_state.working_code,
sizeof(cheat_manager_state.working_code),
MENU_ENUM_LABEL_CHEAT_CODE,
MENU_ENUM_LABEL_VALUE_CHEAT_CODE,
"",
@ -3404,7 +3404,6 @@ static bool setting_append_list(
parent_group,
general_write_handler,
general_read_handler);
settings_data_list_current_add_flags(list, list_info, SD_FLAG_ALLOW_INPUT);
config_uint_cbs(cheat_manager_state.working_cheat.memory_search_size, CHEAT_MEMORY_SEARCH_SIZE,
setting_uint_action_left_with_refresh,setting_uint_action_right_with_refresh,

View File

@ -557,7 +557,8 @@ int setting_set_with_string_representation(rarch_setting_t* setting,
case ST_STRING:
case ST_STRING_OPTIONS:
case ST_ACTION:
strlcpy(setting->value.target.string, value, setting->size);
if ( setting->value.target.string != NULL)
strlcpy(setting->value.target.string, value, setting->size);
break;
case ST_BOOL:
if (string_is_equal(value, "true"))