mirror of
https://github.com/Ryujinx/SDL.git
synced 2025-07-09 08:00:43 +00:00
Do a full UCS4 zero termination on iconv converted strings
We don't necessarily know the size of the output characters, so do a full 32-bit zero termination on the output string. This fixes garbage at the end of Windows clipboard text (cherry picked from commit ecbbac7c7292300cf998a2ff04db3c721203b0b7)
This commit is contained in:
parent
bad5431a14
commit
52d63ba26c
|
@ -810,15 +810,15 @@ char *SDL_iconv_string(const char *tocode, const char *fromcode, const char *inb
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
stringsize = inbytesleft > 4 ? inbytesleft : 4;
|
stringsize = inbytesleft;
|
||||||
string = (char *)SDL_malloc(stringsize + 1);
|
string = (char *)SDL_malloc(stringsize + sizeof(Uint32));
|
||||||
if (string == NULL) {
|
if (string == NULL) {
|
||||||
SDL_iconv_close(cd);
|
SDL_iconv_close(cd);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
outbuf = string;
|
outbuf = string;
|
||||||
outbytesleft = stringsize;
|
outbytesleft = stringsize;
|
||||||
SDL_memset(outbuf, 0, 4);
|
SDL_memset(outbuf, 0, sizeof(Uint32));
|
||||||
|
|
||||||
while (inbytesleft > 0) {
|
while (inbytesleft > 0) {
|
||||||
const size_t oldinbytesleft = inbytesleft;
|
const size_t oldinbytesleft = inbytesleft;
|
||||||
|
@ -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 + 1);
|
string = (char *)SDL_realloc(string, stringsize + sizeof(Uint32));
|
||||||
if (string == NULL) {
|
if (string == NULL) {
|
||||||
SDL_free(oldstring);
|
SDL_free(oldstring);
|
||||||
SDL_iconv_close(cd);
|
SDL_iconv_close(cd);
|
||||||
|
@ -836,7 +836,7 @@ char *SDL_iconv_string(const char *tocode, const char *fromcode, const char *inb
|
||||||
}
|
}
|
||||||
outbuf = string + (outbuf - oldstring);
|
outbuf = string + (outbuf - oldstring);
|
||||||
outbytesleft = stringsize - (outbuf - string);
|
outbytesleft = stringsize - (outbuf - string);
|
||||||
SDL_memset(outbuf, 0, 4);
|
SDL_memset(outbuf, 0, sizeof(Uint32));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
case SDL_ICONV_EILSEQ:
|
case SDL_ICONV_EILSEQ:
|
||||||
|
@ -855,7 +855,7 @@ char *SDL_iconv_string(const char *tocode, const char *fromcode, const char *inb
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*outbuf = '\0';
|
SDL_memset(outbuf, 0, sizeof(Uint32));
|
||||||
SDL_iconv_close(cd);
|
SDL_iconv_close(cd);
|
||||||
|
|
||||||
return string;
|
return string;
|
||||||
|
|
Loading…
Reference in a new issue