all repos — mgba @ 6fecc6d379a14da301606b463ce027e16f2706c6

mGBA Game Boy Advance Emulator

Core: Improve handling failures in mCoreSaveStateNamed function (#1272)

* Core: Do not set time in save state if we could not get the time

Signed-off-by: Francois Berder <fberder@outlook.fr>

* Core: Fix memory leak if gettimeofday or timespec_get failed

Signed-off-by: Francois Berder <fberder@outlook.fr>

* Core: Protect against malloc failure in mCoreSaveStateNamed

Signed-off-by: Francois Berder <fberder@outlook.fr>
François Berder fberder@outlook.fr
Sat, 19 Jan 2019 08:28:40 +0000
commit

6fecc6d379a14da301606b463ce027e16f2706c6

parent

6f336ce0ec9cbc93db3fdae2b9df021198a674f9

1 files changed, 25 insertions(+), 20 deletions(-)

jump to
M src/core/serialize.csrc/core/serialize.c

@@ -306,31 +306,36 @@ size_t stateSize = core->stateSize(core);

if (flags & SAVESTATE_METADATA) { uint64_t* creationUsec = malloc(sizeof(*creationUsec)); + if (creationUsec) { #ifndef _MSC_VER - struct timeval tv; - if (!gettimeofday(&tv, 0)) { - uint64_t usec = tv.tv_usec; - usec += tv.tv_sec * 1000000LL; - STORE_64LE(usec, 0, creationUsec); - } + struct timeval tv; + if (!gettimeofday(&tv, 0)) { + uint64_t usec = tv.tv_usec; + usec += tv.tv_sec * 1000000LL; + STORE_64LE(usec, 0, creationUsec); + } #else - struct timespec ts; - if (timespec_get(&ts, TIME_UTC)) { - uint64_t usec = ts.tv_nsec / 1000; - usec += ts.tv_sec * 1000000LL; - STORE_64LE(usec, 0, creationUsec); - } + struct timespec ts; + if (timespec_get(&ts, TIME_UTC)) { + uint64_t usec = ts.tv_nsec / 1000; + usec += ts.tv_sec * 1000000LL; + STORE_64LE(usec, 0, creationUsec); + } #endif - else { - creationUsec = 0; + else { + free(creationUsec); + creationUsec = 0; + } } - struct mStateExtdataItem item = { - .size = sizeof(*creationUsec), - .data = creationUsec, - .clean = free - }; - mStateExtdataPut(&extdata, EXTDATA_META_TIME, &item); + if (creationUsec) { + struct mStateExtdataItem item = { + .size = sizeof(*creationUsec), + .data = creationUsec, + .clean = free + }; + mStateExtdataPut(&extdata, EXTDATA_META_TIME, &item); + } } if (flags & SAVESTATE_SAVEDATA) {