@@ -233,7 +233,7 @@ uint16_t Adafruit_MQTT::readFullPacket(uint8_t *buffer, uint16_t maxsize,
233
233
// will read a packet and Do The Right Thing with length
234
234
uint8_t *pbuff = buffer;
235
235
236
- uint8_t rlen;
236
+ uint16_t rlen;
237
237
238
238
// read the packet type:
239
239
rlen = readPacket (pbuff, 1 , timeout);
@@ -473,6 +473,22 @@ Adafruit_MQTT_Subscribe *Adafruit_MQTT::readSubscription(int16_t timeout) {
473
473
return handleSubscriptionPacket (len);
474
474
}
475
475
476
+ namespace {
477
+
478
+ uint16_t topicOffsetFromLenth (uint16_t const len)
479
+ {
480
+ if (len < 128 ) { // 7 bits (+1 continuation bit)
481
+ return 0 ;
482
+ } else if (len < 16384 ) { // 14 bits (+2 continuation bits)
483
+ return 1 ;
484
+ } else if (len < 2097152 ) { // 21 bits
485
+ return 2 ;
486
+ }
487
+ return 3 ;
488
+ }
489
+
490
+ } // anon
491
+
476
492
Adafruit_MQTT_Subscribe *Adafruit_MQTT::handleSubscriptionPacket (uint16_t len) {
477
493
uint16_t i, topiclen, datalen;
478
494
@@ -491,7 +507,9 @@ Adafruit_MQTT_Subscribe *Adafruit_MQTT::handleSubscriptionPacket(uint16_t len) {
491
507
}
492
508
493
509
// Parse out length of packet.
494
- topiclen = buffer[3 ];
510
+ uint16_t const topicoffset = topicOffsetFromLength (len);
511
+ uint16_t const topicstart = topicoffset + 4 ;
512
+ topiclen = buffer[3 +topicoffset];
495
513
DEBUG_PRINT (F (" Looking for subscription len " ));
496
514
DEBUG_PRINTLN (topiclen);
497
515
@@ -504,7 +522,7 @@ Adafruit_MQTT_Subscribe *Adafruit_MQTT::handleSubscriptionPacket(uint16_t len) {
504
522
continue ;
505
523
// Stop if the subscription topic matches the received topic. Be careful
506
524
// to make comparison case insensitive.
507
- if (strncasecmp ((char *)buffer + 4 , subscriptions[i]->topic , topiclen) ==
525
+ if (strncasecmp ((char *)buffer + topicstart , subscriptions[i]->topic , topiclen) ==
508
526
0 ) {
509
527
DEBUG_PRINT (F (" Found sub #" ));
510
528
DEBUG_PRINTLN (i);
@@ -520,20 +538,20 @@ Adafruit_MQTT_Subscribe *Adafruit_MQTT::handleSubscriptionPacket(uint16_t len) {
520
538
// Check if it is QoS 1, TODO: we dont support QoS 2
521
539
if ((buffer[0 ] & 0x6 ) == 0x2 ) {
522
540
packet_id_len = 2 ;
523
- packetid = buffer[topiclen + 4 ];
541
+ packetid = buffer[topiclen + topicstart ];
524
542
packetid <<= 8 ;
525
- packetid |= buffer[topiclen + 5 ];
543
+ packetid |= buffer[topiclen + topicstart + 1 ];
526
544
}
527
545
528
546
// zero out the old data
529
547
memset (subscriptions[i]->lastread , 0 , SUBSCRIPTIONDATALEN);
530
548
531
- datalen = len - topiclen - packet_id_len - 4 ;
549
+ datalen = len - topiclen - packet_id_len - topicstart ;
532
550
if (datalen > SUBSCRIPTIONDATALEN) {
533
551
datalen = SUBSCRIPTIONDATALEN - 1 ; // cut it off
534
552
}
535
553
// extract out just the data, into the subscription object itself
536
- memmove (subscriptions[i]->lastread , buffer + 4 + topiclen + packet_id_len,
554
+ memmove (subscriptions[i]->lastread , buffer + topicstart + topiclen + packet_id_len,
537
555
datalen);
538
556
subscriptions[i]->datalen = datalen;
539
557
DEBUG_PRINT (F (" Data len: " ));
0 commit comments