X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=lib%2Fsilcclient%2Fclient_notify.c;h=2ccb574c1ac8a384d7fd6a36939e8a0c5b097e52;hb=805fddcf6431e784f9f77114782a90c9d12f9cbe;hp=005299c61f1a0610c9a3186c8c939f471ed5aca1;hpb=24044237b5a291b34afbc253406e7117f7c7a63e;p=silc.git diff --git a/lib/silcclient/client_notify.c b/lib/silcclient/client_notify.c index 005299c6..2ccb574c 100644 --- a/lib/silcclient/client_notify.c +++ b/lib/silcclient/client_notify.c @@ -4,7 +4,7 @@ Author: Pekka Riikonen - Copyright (C) 1997 - 2007 Pekka Riikonen + Copyright (C) 1997 - 2008 Pekka Riikonen This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -56,9 +56,14 @@ static void silc_client_notify_resolved(SilcClient client, /* If entry is still invalid, resolving failed. Finish notify processing. */ if (notify->client_entry && !notify->client_entry->internal.valid) { /* If resolving timedout try it again many times. */ - if (status != SILC_STATUS_ERR_TIMEDOUT || ++notify->resolve_retry > 1000) + if (status != SILC_STATUS_ERR_TIMEDOUT || ++notify->resolve_retry > 1000) { silc_fsm_next(notify->fsm, silc_client_notify_processed); - silc_client_unref_client(client, conn, notify->client_entry); + + /* Unref client only in case of non-timeout error. In case of timeout + occurred, the routine reprocessing the notify is expected not to + create new references of the entry. */ + silc_client_unref_client(client, conn, notify->client_entry); + } } /* If no entries found, just finish the notify processing */ @@ -293,8 +298,14 @@ SILC_FSM_STATE(silc_client_notify_invite) /* Get the channel entry */ channel = silc_client_get_channel_by_id(client, conn, &id.u.channel_id); - if (!channel) - goto out; + if (!channel) { + /** Resolve channel */ + SILC_FSM_CALL(silc_client_get_channel_by_id_resolve( + client, conn, &id.u.channel_id, + silc_client_notify_resolved, + notify)); + /* NOT REACHED */ + } /* If channel is being resolved handle notify after resolving */ if (channel->internal.resolve_cmd_ident) { @@ -524,7 +535,7 @@ SILC_FSM_STATE(silc_client_notify_signoff) if (tmp && tmp_len > 128) tmp[128] = '\0'; - if (packet->dst_id_type == SILC_ID_CHANNEL) + if (packet->dst_id_type == SILC_ID_CHANNEL) if (silc_id_str2id(packet->dst_id, packet->dst_id_len, SILC_ID_CHANNEL, &id.u.channel_id, sizeof(id.u.channel_id))) channel = silc_client_get_channel_by_id(client, conn, &id.u.channel_id); @@ -690,7 +701,7 @@ SILC_FSM_STATE(silc_client_notify_nick_change) SilcNotifyType type = silc_notify_get_type(payload); SilcArgumentPayload args = silc_notify_get_args(payload); SilcClientEntry client_entry = NULL; - unsigned char *tmp, oldnick[128 + 1]; + unsigned char *tmp, oldnick[256 + 1]; SilcUInt32 tmp_len; SilcID id, id2; SilcBool valid;