In silc_packet_set_ids, the old ID is freed before silc_id_id2str is
called. If silc_id_id2str fails, then silc_packet_set_ids returns
without resetting the ID pointer. The pointer is then free, but not
NULL. When the packet stream is destroyed, silc_packet_stream_destroy
will free the pointer again. Reset the ID pointer to NULL immediately
after freeing it to prevent this.
SILC_LOG_DEBUG(("Setting source ID to packet stream %p", stream));
silc_free(stream->src_id);
+ stream->src_id = NULL;
if (!silc_id_id2str(src_id, src_id_type, tmp, sizeof(tmp), &len)) {
silc_mutex_unlock(stream->lock);
return FALSE;
SILC_LOG_DEBUG(("Setting destination ID to packet stream %p", stream));
silc_free(stream->dst_id);
+ stream->dst_id = NULL;
if (!silc_id_id2str(dst_id, dst_id_type, tmp, sizeof(tmp), &len)) {
silc_mutex_unlock(stream->lock);
return FALSE;