From d6dbe9a6adee565ea3308203ed223a7cac0b49a2 Mon Sep 17 00:00:00 2001 From: Andre Leiradella Date: Sun, 15 Oct 2017 16:49:25 +0100 Subject: [PATCH 1/2] Fixed some memory leaks; added logs for address patching --- cheevos/cheevos.c | 129 ++++++++++++++++++++++++++++++++++------------ 1 file changed, 97 insertions(+), 32 deletions(-) diff --git a/cheevos/cheevos.c b/cheevos/cheevos.c index 86c6ef8b6a..4009ba1d1e 100644 --- a/cheevos/cheevos.c +++ b/cheevos/cheevos.c @@ -1055,14 +1055,24 @@ void cheevos_parse_guest_addr(cheevos_var_t *var, unsigned value) switch (cheevos_locals.console_id) { case CHEEVOS_CONSOLE_NINTENDO: - if (var->value < 0x2000) + if (var->value >= 0x0800 && var->value < 0x2000) + { +#ifdef CHEEVOS_VERBOSE + RARCH_LOG("[CHEEVOS]: NES memory address in mirrorred RAM %X, adjusted to %X\n", var->value, var->value & 0x07ff); +#endif var->value &= 0x07ff; + } break; case CHEEVOS_CONSOLE_GAMEBOY_COLOR: if (var->value >= 0xe000 && var->value <= 0xfdff) + { +#ifdef CHEEVOS_VERBOSE + RARCH_LOG("[CHEEVOS]: GBC memory address in echo RAM %X, adjusted to %X\n", var->value, var->value - 0x2000); +#endif var->value -= 0x2000; - break; + } + break; } if (system->mmaps.num_descriptors != 0) @@ -1075,22 +1085,45 @@ void cheevos_parse_guest_addr(cheevos_var_t *var, unsigned value) /* Patch the address to correctly map it to the mmaps */ case CHEEVOS_CONSOLE_GAMEBOY_ADVANCE: if (var->value < 0x8000) /* Internal RAM */ - var->value += 0x3000000; - else /* Work RAM */ - var->value += 0x2000000 - 0x8000; - break; - case CHEEVOS_CONSOLE_PC_ENGINE: - var->value += 0x1f0000; - break; - case CHEEVOS_CONSOLE_SUPER_NINTENDO: - if (var->value < 0x020000) /* Work RAM */ - var->value += 0x7e0000; - else /* Save RAM */ { - var->value -= 0x020000; - var->value += 0x006000; +#ifdef CHEEVOS_VERBOSE + RARCH_LOG("[CHEEVOS]: GBA memory address %X adjusted to %X\n", var->value, var->value + 0x3000000); +#endif + var->value += 0x3000000; + } + else /* Work RAM */ + { +#ifdef CHEEVOS_VERBOSE + RARCH_LOG("[CHEEVOS]: GBA memory address %X adjusted to %X\n", var->value, var->value + 0x2000000 - 0x8000); +#endif + var->value += 0x2000000 - 0x8000; } break; + + case CHEEVOS_CONSOLE_PC_ENGINE: +#ifdef CHEEVOS_VERBOSE + RARCH_LOG("[CHEEVOS]: PCE memory address %X adjusted to %X\n", var->value, var->value + 0x1f0000); +#endif + var->value += 0x1f0000; + break; + + case CHEEVOS_CONSOLE_SUPER_NINTENDO: + if (var->value < 0x020000) /* Work RAM */ + { +#ifdef CHEEVOS_VERBOSE + RARCH_LOG("[CHEEVOS]: SNES memory address %X adjusted to %X\n", var->value, var->value + 0x7e0000); +#endif + var->value += 0x7e0000; + } + else /* Save RAM */ + { +#ifdef CHEEVOS_VERBOSE + RARCH_LOG("[CHEEVOS]: SNES memory address %X adjusted to %X\n", var->value, var->value + 0x006000 - 0x020000); +#endif + var->value += 0x006000 - 0x020000; + } + break; + default: break; } @@ -1102,15 +1135,20 @@ void cheevos_parse_guest_addr(cheevos_var_t *var, unsigned value) { if (((desc->core.start ^ var->value) & desc->core.select) == 0) { - var->bank_id = (int)(desc - system->mmaps.descriptors); - var->value = (unsigned)cheevos_reduce( + unsigned addr = var->value; + var->bank_id = (int)(desc - system->mmaps.descriptors); + var->value = (unsigned)cheevos_reduce( (var->value - desc->core.start) & desc->disconnect_mask, desc->core.disconnect); - if (var->value >= desc->core.len) + if (var->value >= desc->core.len) var->value -= cheevos_highest_bit(var->value); - var->value += desc->core.offset; + var->value += desc->core.offset; + +#ifdef CHEEVOS_VERBOSE + RARCH_LOG("[CHEEVOS]: Address %X set to descriptor %d at offset %X\n", addr, var->bank_id + 1, var->value); +#endif break; } } @@ -1327,15 +1365,16 @@ static int cheevos_parse_condition(cheevos_condition_t *condition, const char* m { unsigned set = 0; cheevos_condset_t *condset = NULL; - cheevos_condset_t *conds = (cheevos_condset_t*) - calloc(condition->count, sizeof(cheevos_condset_t)); + cheevos_condset_t *conds = NULL; const cheevos_condset_t* end; - if (!conds) + condition->condsets = (cheevos_condset_t*) + calloc(condition->count, sizeof(cheevos_condset_t)); + + if (!condition->condsets) return -1; - condition->condsets = conds; - end = condition->condsets + condition->count; + end = condition->condsets + condition->count; for (condset = condition->condsets; condset < end; condset++, set++) { @@ -1354,7 +1393,14 @@ static int cheevos_parse_condition(cheevos_condition_t *condition, const char* m calloc(condset->count, sizeof(cheevos_cond_t)); if (!conds) + { + while (--condset >= condition->condsets) + { + free((void*)condset->conds); + } + return -1; + } condset->conds = conds; cheevos_parse_memaddr(condset->conds, memaddr, set); @@ -3544,10 +3590,17 @@ static int cheevos_iterate(coro_t* coro) CORO_GOSUB(HTTP_GET); - if (!cheevos_deactivate_unlocks(CHEEVOS_VAR_JSON, CHEEVOS_ACTIVE_SOFTCORE)) - RARCH_LOG("[CHEEVOS]: deactivated unlocked achievements in softcore mode.\n"); + if (CHEEVOS_VAR_JSON) + { + if (!cheevos_deactivate_unlocks(CHEEVOS_VAR_JSON, CHEEVOS_ACTIVE_SOFTCORE)) + RARCH_LOG("[CHEEVOS]: deactivated unlocked achievements in softcore mode.\n"); + else + RARCH_ERR("[CHEEVOS]: error deactivating unlocked achievements in softcore mode.\n"); + + free((void*)CHEEVOS_VAR_JSON); + } else - RARCH_ERR("[CHEEVOS]: error deactivating unlocked achievements in softcore mode.\n"); + RARCH_ERR("[CHEEVOS]: error retrieving list of unlocked achievements in softcore mode.\n"); /* Deactivate achievements in hardcore mode. */ snprintf( @@ -3565,10 +3618,17 @@ static int cheevos_iterate(coro_t* coro) CORO_GOSUB(HTTP_GET); - if (!cheevos_deactivate_unlocks(CHEEVOS_VAR_JSON, CHEEVOS_ACTIVE_HARDCORE)) - RARCH_LOG("[CHEEVOS]: deactivated unlocked achievements in hardcore mode.\n"); + if (CHEEVOS_VAR_JSON) + { + if (!cheevos_deactivate_unlocks(CHEEVOS_VAR_JSON, CHEEVOS_ACTIVE_HARDCORE)) + RARCH_LOG("[CHEEVOS]: deactivated unlocked achievements in hardcore mode.\n"); + else + RARCH_ERR("[CHEEVOS]: error deactivating unlocked achievements in hardcore mode.\n"); + + free((void*)CHEEVOS_VAR_JSON); + } else - RARCH_ERR("[CHEEVOS]: error deactivating unlocked achievements in hardcore mode.\n"); + RARCH_ERR("[CHEEVOS]: error retrieving list of unlocked achievements in hardcore mode.\n"); #endif CORO_RET(); @@ -3595,8 +3655,13 @@ static int cheevos_iterate(coro_t* coro) CORO_GOSUB(HTTP_GET); - if (!CHEEVOS_VAR_JSON) - CORO_GOTO(PLAYING); + if (CHEEVOS_VAR_JSON) + { + RARCH_LOG("[CHEEVOS]: posted playing activity.\n"); + free((void*)CHEEVOS_VAR_JSON); + } + else + RARCH_ERR("[CHEEVOS]: error posting playing activity.\n"); RARCH_LOG("[CHEEVOS]: posted playing activity.\n"); CORO_RET(); From c7849de707042228f06f58c2c36db349e07548ed Mon Sep 17 00:00:00 2001 From: Andre Leiradella Date: Sun, 15 Oct 2017 16:51:26 +0100 Subject: [PATCH 2/2] Fixed some cheevos with required hits not registering --- cheevos/cheevos.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/cheevos/cheevos.c b/cheevos/cheevos.c index 4009ba1d1e..977e38a9cf 100644 --- a/cheevos/cheevos.c +++ b/cheevos/cheevos.c @@ -2204,7 +2204,15 @@ static void cheevos_test_cheevo_set(const cheevoset_t *set) { valid = cheevos_test_cheevo(cheevo); - if (valid && !cheevo->last) + if (cheevo->last) + { + cheevos_condset_t* condset = cheevo->condition.condsets; + const cheevos_condset_t* end = cheevo->condition.condsets + cheevo->condition.count; + + for (; condset < end; condset++) + cheevos_reset_cond_set(condset, 0); + } + else if (valid) { char url[256]; url[0] = '\0';