{
SilcClientConnection conn = (SilcClientConnection)sock->user_data;
SilcPrivateMessagePayload payload = NULL;
- SilcIDCacheEntry id_cache;
+ SilcIDCacheEntry id_cache = NULL;
SilcClientID *remote_id = NULL;
SilcClientEntry remote_client;
SilcMessageFlags flags;
if (!silc_idcache_find_by_id_one_ext(conn->client_cache, (void *)remote_id,
NULL, NULL,
silc_hash_client_id_compare, NULL,
- &id_cache)) {
+ &id_cache) ||
+ ((SilcClientEntry)id_cache->context)->nickname == NULL) {
+
+ if (id_cache && id_cache->context) {
+ remote_client = (SilcClientEntry)id_cache->context;
+ if (remote_client->status & SILC_CLIENT_STATUS_RESOLVING) {
+ remote_client->status &= ~SILC_CLIENT_STATUS_RESOLVING;
+ goto out;
+ }
+ remote_client->status |= SILC_CLIENT_STATUS_RESOLVING;
+ }
+
/* Resolve the client info */
silc_client_get_client_by_id_resolve(client, conn, remote_id,
silc_client_private_message_cb,
remote_client = (SilcClientEntry)id_cache->context;
/* Parse the payload and decrypt it also if private message key is set */
- payload = silc_private_message_payload_parse(packet->buffer,
+ payload = silc_private_message_payload_parse(packet->buffer->data,
+ packet->buffer->len,
remote_client->receive_key);
if (!payload) {
silc_free(remote_id);
out:
if (payload)
silc_private_message_payload_free(payload);
- if (remote_id)
- silc_free(remote_id);
+ silc_free(remote_id);
}
/* Function that actually employes the received private message key */