From b6899f82fb35896c94d831a5eff3ec99dd6cd45e Mon Sep 17 00:00:00 2001 From: Ozkan Sezer Date: Fri, 10 May 2024 18:56:24 +0300 Subject: [PATCH] SDL_iconv_string: simplify recomputation of outbuf and outbytesleft Noticed this in SDL-1.2 where gcc-13 emits a -Wuse-after-free warning. No such warning in SDL2 and SDL3, because unlike SDL1.2, SDL_realloc() is not a macro expanding to libc realloc(). It warns, of course, if SDL_realloc() is replaced with plain realloc(): src/stdlib/SDL_iconv.c: In function 'SDL_iconv_string_REAL': src/stdlib/SDL_iconv.c:824:39: warning: pointer 'oldstring' may be used after 'realloc' [-Wuse-after-free] 824 | outbuf = string + (outbuf - oldstring); | ~~~~~~~~^~~~~~~~~~~~ src/stdlib/SDL_iconv.c:818:30: note: call to 'realloc' here 818 | string = (char *)realloc(string, stringsize + sizeof(Uint32)); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (cherry picked from commit 22056268168fa62bb66af62ef648b7030c9522d9) --- src/stdlib/SDL_iconv.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/stdlib/SDL_iconv.c b/src/stdlib/SDL_iconv.c index 2ab748c98f..416e199b76 100644 --- a/src/stdlib/SDL_iconv.c +++ b/src/stdlib/SDL_iconv.c @@ -822,6 +822,7 @@ char *SDL_iconv_string(const char *tocode, const char *fromcode, const char *inb switch (retCode) { case SDL_ICONV_E2BIG: { + const ptrdiff_t diff = (ptrdiff_t) (outbuf - string); char *oldstring = string; stringsize *= 2; string = (char *)SDL_realloc(string, stringsize + sizeof(Uint32)); @@ -830,8 +831,8 @@ char *SDL_iconv_string(const char *tocode, const char *fromcode, const char *inb SDL_iconv_close(cd); return NULL; } - outbuf = string + (outbuf - oldstring); - outbytesleft = stringsize - (outbuf - string); + outbuf = string + diff; + outbytesleft = stringsize - diff; SDL_memset(outbuf, 0, sizeof(Uint32)); continue; }