Mercurial > pidgin
changeset 21531:07c91ea3da0e
Fix some confusion between iq ids and sids. This allows me to send files to Gajim (as long as Gajim has initiated the connection to me - there seems to a bug there where it will try to make a new connection if I've initiated the connection). Also fix a null ptr deref crash.
author | Daniel Atallah <daniel.atallah@gmail.com> |
---|---|
date | Thu, 15 Nov 2007 20:50:28 +0000 |
parents | bfa475b15dc5 |
children | 0e9129f83906 |
files | libpurple/protocols/bonjour/bonjour_ft.c |
diffstat | 1 files changed, 16 insertions(+), 13 deletions(-) [+] |
line wrap: on
line diff
--- a/libpurple/protocols/bonjour/bonjour_ft.c Thu Nov 15 19:36:19 2007 +0000 +++ b/libpurple/protocols/bonjour/bonjour_ft.c Thu Nov 15 20:50:28 2007 +0000 @@ -37,7 +37,7 @@ static void bonjour_xfer_init(PurpleXfer *xfer); static void -bonjour_xfer_receive(PurpleConnection *pc, const char *id, const char *from, +bonjour_xfer_receive(PurpleConnection *pc, const char *id, const char *sid, const char *from, const int filesize, const char *filename, int option); static void bonjour_free_xfer(PurpleXfer *xfer); @@ -202,23 +202,23 @@ purple_debug_info("bonjour", "xep file transfer stream initialization offer-id=%d.\n", next_id); /* Assign stream id. */ - memset(buf, 0, 32); - g_snprintf(buf, sizeof(buf), "%u", next_id++); - iq = xep_iq_new(xf->data, XEP_IQ_SET, to, purple_account_get_username(bd->jabber_data->account), buf); + g_free(xf->iq_id); + xf->iq_id = g_strdup_printf("%u", next_id++); + iq = xep_iq_new(xf->data, XEP_IQ_SET, to, purple_account_get_username(bd->jabber_data->account), xf->iq_id); if(iq == NULL) return; - g_free(xf->sid); - xf->sid = g_strdup(buf); /*Construct Stream initialization offer message.*/ si_node = xmlnode_new_child(iq->node, "si"); xmlnode_set_namespace(si_node, "http://jabber.org/protocol/si"); xmlnode_set_attrib(si_node, "profile", "http://jabber.org/protocol/si/profile/file-transfer"); + g_free(xf->sid); + xf->sid = g_strdup(xf->iq_id); + xmlnode_set_attrib(si_node, "id", xf->sid); file = xmlnode_new_child(si_node, "file"); xmlnode_set_namespace(file, "http://jabber.org/protocol/si/profile/file-transfer"); xmlnode_set_attrib(file, "name", xfer->filename); - memset(buf, 0, 32); g_snprintf(buf, sizeof(buf), "%" G_GSIZE_FORMAT, xfer->size); xmlnode_set_attrib(file, "size", buf); @@ -268,7 +268,7 @@ bd = xf->data; purple_debug_info("bonjour", "xep file transfer stream initialization result.\n"); - iq = xep_iq_new(bd, XEP_IQ_RESULT, to, purple_account_get_username(bd->jabber_data->account), xf->sid); + iq = xep_iq_new(bd, XEP_IQ_RESULT, to, purple_account_get_username(bd->jabber_data->account), xf->iq_id); if(iq == NULL) return; @@ -446,6 +446,8 @@ int filesize = 0; xmlnode *file; + const char *sid = xmlnode_get_attrib(si, "id"); + if ((file = xmlnode_get_child(si, "file"))) { filename = xmlnode_get_attrib(file, "name"); if((filesize_str = xmlnode_get_attrib(file, "size"))) @@ -454,7 +456,7 @@ /* TODO: Make sure that it is advertising a bytestreams transfer */ - bonjour_xfer_receive(pc, id, pb->name, filesize, filename, XEP_BYTESTREAMS); + bonjour_xfer_receive(pc, id, sid, pb->name, filesize, filename, XEP_BYTESTREAMS); parsed_receive = TRUE; } @@ -559,7 +561,7 @@ if (!found) { purple_debug_error("bonjour", "Didn't find an acceptable streamhost.\n"); - if (iq_id) + if (iq_id && xfer != NULL) xep_ft_si_reject(bd, iq_id, xfer->who, "404", "cancel"); } @@ -570,7 +572,7 @@ } static void -bonjour_xfer_receive(PurpleConnection *pc, const char *id, const char *from, +bonjour_xfer_receive(PurpleConnection *pc, const char *id, const char *sid, const char *from, const int filesize, const char *filename, int option) { PurpleXfer *xfer = NULL; @@ -591,7 +593,8 @@ xfer->data = xf = g_new0(XepXfer, 1); xf->data = bd; purple_xfer_set_filename(xfer, filename); - xf->sid = g_strdup(id); + xf->iq_id = g_strdup(id); + xf->sid = g_strdup(sid); if(filesize > 0) purple_xfer_set_size(xfer, filesize); @@ -626,7 +629,7 @@ } else if(acceptfd == -1) { /* This should cancel the ft */ - purple_debug_error("Error accepting incoming SOCKS5 connection. (%d)\n", errno); + purple_debug_error("bonjour", "Error accepting incoming SOCKS5 connection. (%d)\n", errno); purple_input_remove(xfer->watcher); xfer->watcher = 0;