Browse Source

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)
(cherry picked from commit b6899f82fb35896c94d831a5eff3ec99dd6cd45e)
Ozkan Sezer 11 months ago
parent
commit
9dcfc308ef
1 changed files with 3 additions and 2 deletions
  1. 3 2
      src/stdlib/SDL_iconv.c

+ 3 - 2
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;
         }