mirror of
https://github.com/libretro/beetle-pce-fast-libretro.git
synced 2024-11-22 23:39:50 +00:00
Avoid malloc & memcpy in retro_serialize
This commit is contained in:
parent
18be318103
commit
661ecf42c3
22
libretro.cpp
22
libretro.cpp
@ -2529,6 +2529,7 @@ size_t retro_serialize_size(void)
|
|||||||
StateMem st;
|
StateMem st;
|
||||||
|
|
||||||
st.data = NULL;
|
st.data = NULL;
|
||||||
|
st.data_frontend = NULL;
|
||||||
st.loc = 0;
|
st.loc = 0;
|
||||||
st.len = 0;
|
st.len = 0;
|
||||||
st.malloced = 0;
|
st.malloced = 0;
|
||||||
@ -2546,22 +2547,24 @@ bool retro_serialize(void *data, size_t size)
|
|||||||
{
|
{
|
||||||
StateMem st;
|
StateMem st;
|
||||||
bool ret = false;
|
bool ret = false;
|
||||||
uint8_t *_dat = (uint8_t*)malloc(size);
|
|
||||||
|
|
||||||
if (!_dat)
|
st.data_frontend = (uint8_t *)data;
|
||||||
return false;
|
st.data = st.data_frontend;
|
||||||
|
|
||||||
/* Mednafen can realloc the buffer so we need to ensure this is safe. */
|
|
||||||
st.data = _dat;
|
|
||||||
st.loc = 0;
|
st.loc = 0;
|
||||||
st.len = 0;
|
st.len = 0;
|
||||||
st.malloced = size;
|
st.malloced = size;
|
||||||
st.initial_malloc = 0;
|
st.initial_malloc = 0;
|
||||||
|
|
||||||
|
/* MDFNSS_SaveSM will malloc separate memory for st.data to complete
|
||||||
|
* the save if the passed-in size is too small */
|
||||||
ret = MDFNSS_SaveSM(&st, 0, 0, NULL, NULL, NULL);
|
ret = MDFNSS_SaveSM(&st, 0, 0, NULL, NULL, NULL);
|
||||||
|
|
||||||
memcpy(data, st.data, size);
|
if (st.data != st.data_frontend)
|
||||||
free(st.data);
|
{
|
||||||
|
log_cb(RETRO_LOG_WARN, "Save state size has increased\n");
|
||||||
|
free(st.data);
|
||||||
|
ret = false;
|
||||||
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -2570,7 +2573,8 @@ bool retro_unserialize(const void *data, size_t size)
|
|||||||
{
|
{
|
||||||
StateMem st;
|
StateMem st;
|
||||||
|
|
||||||
st.data = (uint8_t*)data;
|
st.data_frontend = (uint8_t *)data;
|
||||||
|
st.data = st.data_frontend;
|
||||||
st.loc = 0;
|
st.loc = 0;
|
||||||
st.len = size;
|
st.len = size;
|
||||||
st.malloced = 0;
|
st.malloced = 0;
|
||||||
|
@ -54,7 +54,16 @@ static int32_t smem_write(StateMem *st, void *buffer, uint32_t len)
|
|||||||
|
|
||||||
while(newsize < (len + st->loc))
|
while(newsize < (len + st->loc))
|
||||||
newsize *= 2;
|
newsize *= 2;
|
||||||
st->data = (uint8_t *)realloc(st->data, newsize);
|
|
||||||
|
/* Don't realloc data_frontend memory */
|
||||||
|
if (st->data == st->data_frontend && st->data != NULL )
|
||||||
|
{
|
||||||
|
st->data = (uint8_t *)malloc(newsize);
|
||||||
|
memcpy(st->data, st->data_frontend, st->malloced);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
st->data = (uint8_t *)realloc(st->data, newsize);
|
||||||
|
|
||||||
st->malloced = newsize;
|
st->malloced = newsize;
|
||||||
}
|
}
|
||||||
memcpy(st->data + st->loc, buffer, len);
|
memcpy(st->data + st->loc, buffer, len);
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
uint8_t *data;
|
uint8_t *data;
|
||||||
|
uint8_t *data_frontend; /* never realloc'd */
|
||||||
uint32_t loc;
|
uint32_t loc;
|
||||||
uint32_t len;
|
uint32_t len;
|
||||||
uint32_t malloced;
|
uint32_t malloced;
|
||||||
|
Loading…
Reference in New Issue
Block a user