Always allocate zt in output of SDL_iconv_string()

Before this, the function could not be used on buffers,
as it would not account for the zero-termination unless
it was included in the input.

(cherry picked from commit 5f5abb6805)
This commit is contained in:
Eddy Jansson 2023-02-28 17:50:26 +01:00 committed by Sam Lantinga
parent 7c86d96e86
commit 2660da6f5c
2 changed files with 4 additions and 3 deletions

View File

@ -688,7 +688,7 @@ extern DECLSPEC size_t SDLCALL SDL_iconv(SDL_iconv_t cd, const char **inbuf,
size_t * outbytesleft); size_t * outbytesleft);
/** /**
* This function converts a string between encodings in one pass, returning a * This function converts a buffer or string between encodings in one pass, returning a
* string that must be freed with SDL_free() or NULL on error. * string that must be freed with SDL_free() or NULL on error.
* *
* \since This function is available since SDL 2.0.0. * \since This function is available since SDL 2.0.0.

View File

@ -811,7 +811,7 @@ char *SDL_iconv_string(const char *tocode, const char *fromcode, const char *inb
} }
stringsize = inbytesleft > 4 ? inbytesleft : 4; stringsize = inbytesleft > 4 ? inbytesleft : 4;
string = (char *)SDL_malloc(stringsize); string = (char *)SDL_malloc(stringsize + 1);
if (string == NULL) { if (string == NULL) {
SDL_iconv_close(cd); SDL_iconv_close(cd);
return NULL; return NULL;
@ -828,7 +828,7 @@ char *SDL_iconv_string(const char *tocode, const char *fromcode, const char *inb
{ {
char *oldstring = string; char *oldstring = string;
stringsize *= 2; stringsize *= 2;
string = (char *)SDL_realloc(string, stringsize); string = (char *)SDL_realloc(string, stringsize + 1);
if (string == NULL) { if (string == NULL) {
SDL_free(oldstring); SDL_free(oldstring);
SDL_iconv_close(cd); SDL_iconv_close(cd);
@ -855,6 +855,7 @@ char *SDL_iconv_string(const char *tocode, const char *fromcode, const char *inb
break; break;
} }
} }
*outbuf = '\0';
SDL_iconv_close(cd); SDL_iconv_close(cd);
return string; return string;