diff options
Diffstat (limited to 'libpurple/upnp.c')
-rw-r--r-- | libpurple/upnp.c | 27 |
1 files changed, 19 insertions, 8 deletions
diff --git a/libpurple/upnp.c b/libpurple/upnp.c index f91a70247e..3a6b3ce5ff 100644 --- a/libpurple/upnp.c +++ b/libpurple/upnp.c @@ -403,6 +403,11 @@ upnp_parse_description_cb(PurpleUtilFetchUrlData *url_data, gpointer user_data, lookup_internal_ip(); } + if (dd->inpa > 0) + purple_input_remove(dd->inpa); + if (dd->tima > 0) + purple_timeout_remove(dd->tima); + g_free(dd); } @@ -506,6 +511,8 @@ purple_upnp_discover_timeout(gpointer data) if (dd->inpa) purple_input_remove(dd->inpa); + if (dd->tima > 0) + purple_timeout_remove(dd->tima); dd->inpa = 0; dd->tima = 0; @@ -610,7 +617,7 @@ purple_upnp_discover_send_broadcast(UPnPDiscoveryData *dd) /* We have already done all our retries. Make sure that the callback * doesn't get called before the original function returns */ - purple_timeout_add(10, purple_upnp_discover_timeout, dd); + dd->tima = purple_timeout_add(10, purple_upnp_discover_timeout, dd); } void @@ -647,7 +654,7 @@ purple_upnp_discover(PurpleUPnPCallback cb, gpointer cb_data) "purple_upnp_discover(): Failed In sock creation\n"); /* Short circuit the retry attempts */ dd->retry_count = NUM_UDP_ATTEMPTS; - purple_timeout_add(10, purple_upnp_discover_timeout, dd); + dd->tima = purple_timeout_add(10, purple_upnp_discover_timeout, dd); return; } @@ -659,7 +666,7 @@ purple_upnp_discover(PurpleUPnPCallback cb, gpointer cb_data) "purple_upnp_discover(): Failed In gethostbyname\n"); /* Short circuit the retry attempts */ dd->retry_count = NUM_UDP_ATTEMPTS; - purple_timeout_add(10, purple_upnp_discover_timeout, dd); + dd->tima = purple_timeout_add(10, purple_upnp_discover_timeout, dd); return; } @@ -919,16 +926,20 @@ void purple_upnp_cancel_port_mapping(UPnPMappingAddRemove *ar) GSList *l; /* Remove ar from discovery_callbacks if present; it was inserted after a cb. - * The same cb may be in the list multple times, so be careful to remove the one assocaited with ar. */ - l = discovery_callbacks; + * The same cb may be in the list multiple times, so be careful to remove + * the one associated with ar. */ + l = discovery_callbacks; while (l) { - if (l->next && (l->next->data == ar)) { - discovery_callbacks = g_slist_delete_link(discovery_callbacks, l->next); + GSList *next = l->next; + + if (next && (next->data == ar)) { + discovery_callbacks = g_slist_delete_link(discovery_callbacks, next); + next = l->next; discovery_callbacks = g_slist_delete_link(discovery_callbacks, l); } - l = l->next; + l = next; } if (ar->tima > 0) |