+ SILC_LOG_DEBUG(("Parsing channel payload list"));
+
+ silc_buffer_set(&buffer, (unsigned char *)payload, payload_len);
+ list = silc_dlist_init();
+
+ while (buffer.len) {
+ newp = silc_calloc(1, sizeof(*newp));
+ if (!newp)
+ goto err;
+ ret = silc_buffer_unformat(&buffer,
+ SILC_STR_UI16_NSTRING_ALLOC(&newp->channel_name,
+ &newp->name_len),
+ SILC_STR_UI16_NSTRING_ALLOC(&newp->channel_id,
+ &newp->id_len),
+ SILC_STR_UI_INT(&newp->mode),
+ SILC_STR_END);
+ if (ret == -1)
+ goto err;
+
+ if ((newp->name_len < 1 || newp->name_len > buffer.len) ||
+ (newp->id_len < 1 || newp->id_len > buffer.len)) {
+ SILC_LOG_ERROR(("Incorrect channel payload in packet, packet dropped"));
+ goto err;
+ }
+
+ len = 2 + newp->name_len + 2 + newp->id_len + 4;
+ if (buffer.len < len)
+ break;
+ silc_buffer_pull(&buffer, len);