Mercurial > pidgin.yaz
changeset 10039:cf02e7104706
[gaim-migrate @ 10998]
A patch from rian hunter (chrono86):
In src/protocols/oscar/oscar.c, in the function
gaim_plugin_oscar_convert_to_best_encoding. g_convert
is called multiple times. As its 5th argument g_convert
takes a gsize* (8 byte), yet the argument to
gaim_plugin_oscar_convert_to_best_encoding is a int* (4
byte).
On LP64 machines this can allow the int* to be
overwritten. This is especially bad on big endian
64-bit machines, causing the high 32-bits to be written
into the low 32-bits of the int.
This is a quick fix patch that lets g_convert deal with
a gsize* pointer instead, then casting the value at
gsize* to the value at the int*.
A real fix would be to fix the aim_sendimext_args
structure to have a gsize instead of an int (and all
functions that use the aim_sendimext_args struct), and
changing gaim_plugin_oscar_convert_to_best_encoding to
accept a gsize*. of course, this woudl promote glib2
dependence, so that's probably not the best thing to do.
committer: Tailor Script <tailor@pidgin.im>
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Sat, 18 Sep 2004 23:17:18 +0000 |
parents | eb8ccdd6f5f2 |
children | 81059dce3aed |
files | COPYRIGHT src/protocols/oscar/oscar.c |
diffstat | 2 files changed, 12 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- a/COPYRIGHT Sat Sep 18 22:25:12 2004 +0000 +++ b/COPYRIGHT Sat Sep 18 23:17:18 2004 +0000 @@ -73,6 +73,7 @@ Casey Ho Iain Holmes Karsten Huneycutt +Rian Hunter Henry Jen Akuke Kok Cole Kowalski
--- a/src/protocols/oscar/oscar.c Sat Sep 18 22:25:12 2004 +0000 +++ b/src/protocols/oscar/oscar.c Sat Sep 18 23:17:18 2004 +0000 @@ -497,7 +497,7 @@ static void gaim_plugin_oscar_convert_to_best_encoding(GaimConnection *gc, const char *destsn, const gchar *from, - gchar **msg, int *msglen, + gchar **msg, int *msglen_int, fu16_t *charset, fu16_t *charsubset) { OscarData *od = gc->proto_data; @@ -505,12 +505,14 @@ GError *err = NULL; aim_userinfo_t *userinfo = NULL; const gchar *charsetstr; + gsize msglen; /* Attempt to send as ASCII */ - *msg = g_convert(from, strlen(from), "ASCII", "UTF-8", NULL, msglen, NULL); + *msg = g_convert(from, strlen(from), "ASCII", "UTF-8", NULL, &msglen, NULL); if (*msg != NULL) { *charset = AIM_CHARSET_ASCII; *charsubset = 0x0000; + *msglen_int = msglen; return; } @@ -522,10 +524,11 @@ userinfo = aim_locate_finduserinfo(od->sess, destsn); if ((userinfo != NULL) && (userinfo->capabilities & AIM_CAPS_ICQUTF8)) { - *msg = g_convert(from, strlen(from), "UCS-2BE", "UTF-8", NULL, msglen, NULL); + *msg = g_convert(from, strlen(from), "UCS-2BE", "UTF-8", NULL, &msglen, NULL); if (*msg != NULL) { *charset = AIM_CHARSET_UNICODE; *charsubset = 0x0000; + *msglen_int = msglen; return; } } @@ -538,20 +541,22 @@ if ((destsn != NULL) && aim_sn_is_icq(destsn)) charsetstr = gaim_account_get_string(account, "encoding", OSCAR_DEFAULT_CUSTOM_ENCODING); - *msg = g_convert(from, strlen(from), charsetstr, "UTF-8", NULL, msglen, NULL); + *msg = g_convert(from, strlen(from), charsetstr, "UTF-8", NULL, &msglen, NULL); if (*msg != NULL) { *charset = AIM_CHARSET_CUSTOM; *charsubset = 0x0000; + *msglen_int = msglen; return; } /* * Nothing else worked, so send as UCS-2BE. */ - *msg = g_convert(from, strlen(from), "UCS-2BE", "UTF-8", NULL, msglen, &err); + *msg = g_convert(from, strlen(from), "UCS-2BE", "UTF-8", NULL, &msglen, &err); if (*msg != NULL) { *charset = AIM_CHARSET_UNICODE; *charsubset = 0x0000; + *msglen_int = msglen; return; } @@ -560,7 +565,7 @@ gaim_debug_error("oscar", "This should NEVER happen! Sending UTF-8 text flagged as ASCII.\n"); *msg = g_strdup(from); - *msglen = strlen(*msg); + *msglen_int = strlen(*msg); *charset = AIM_CHARSET_ASCII; *charsubset = 0x0000; return;