- int i;
- SilcBuffer buffer;
- unsigned int len, pad_len;
- unsigned char pad[SILC_PACKET_MAX_PADLEN];
+ SilcBufferStruct buffer;
+ SilcDList list;
+ SilcChannelPayload newp;
+ SilcUInt32 len;
+ int ret;
+
+ SILC_LOG_DEBUG(("Parsing channel payload list"));
+
+ silc_buffer_set(&buffer, (unsigned char *)payload, payload_len);
+ list = silc_dlist_init();
+
+ while (silc_buffer_len(&buffer)) {
+ 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 > silc_buffer_len(&buffer) - 8) ||
+ (newp->id_len < 1 || newp->id_len > silc_buffer_len(&buffer) - 8) ||
+ (newp->id_len + newp->name_len > silc_buffer_len(&buffer) - 8)) {
+ SILC_LOG_ERROR(("Incorrect channel payload in packet, packet dropped"));
+ goto err;
+ }