From c05ec273346348e3b8da10a77b90c2e7029a9a28 Mon Sep 17 00:00:00 2001 From: libretroadmin Date: Sun, 16 Jun 2024 18:44:08 +0200 Subject: [PATCH] task_save_handler - rewrite code - put string on stack instead of heap, avoid using strlcat --- tasks/task_save.c | 31 ++++++++++++++----------------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/tasks/task_save.c b/tasks/task_save.c index 464cd3e3ad..93b1c6620e 100644 --- a/tasks/task_save.c +++ b/tasks/task_save.c @@ -54,12 +54,12 @@ read/write is a possible suspend to JS code */ #define SAVE_STATE_CHUNK 4096 * 4096 #else -/* A low common denominator write chunk size. On a slow - (speed class 6) SD card, we can write 6MB/s. That gives us - roughly 100KB/frame. - This means we can write savestates with one syscall for cores - with less than 100KB of state. Class 10 is the standard now - even for lousy cards and supports 10MB/s, so you may prefer +/* A low common denominator write chunk size. On a slow + (speed class 6) SD card, we can write 6MB/s. That gives us + roughly 100KB/frame. + This means we can write savestates with one syscall for cores + with less than 100KB of state. Class 10 is the standard now + even for lousy cards and supports 10MB/s, so you may prefer to put this to 170KB. This all assumes that task_save's loop is iterated once per frame at 60 FPS; if it's updated less frequently this number could be doubled or quadrupled depending @@ -537,8 +537,7 @@ static void task_save_handler(retro_task_t *task) if (task_get_cancelled(task) || written != remaining) { - size_t err_size = 8192 * sizeof(char); - char *err = (char*)malloc(err_size); + char msg[PATH_MAX_LENGTH]; if (state->flags & SAVE_TASK_FLAG_UNDO_SAVE) { @@ -546,21 +545,19 @@ static void task_save_handler(retro_task_t *task) MSG_FAILED_TO_UNDO_SAVE_STATE); RARCH_ERR("[State]: %s \"%s\".\n", failed_undo_str, undo_save_buf.path); - err[0] = '\0'; - snprintf(err, err_size - 1, "%s \"RAM\".", failed_undo_str); + snprintf(msg, sizeof(msg), "%s \"RAM\".", failed_undo_str); } else { - size_t _len = strlcpy(err, + size_t _len = strlcpy(msg, msg_hash_to_str(MSG_FAILED_TO_SAVE_STATE_TO), - err_size - 1); - err[ _len] = ' '; - err[++_len] = '\0'; - strlcat(err, state->path, err_size - 1); + sizeof(msg)); + msg[ _len] = ' '; + msg[++_len] = '\0'; + strlcpy(msg + _len, state->path, sizeof(msg) - _len); } - task_set_error(task, strdup(err)); - free(err); + task_set_error(task, strdup(msg)); task_save_handler_finished(task, state); return; }