adafruit / Adafruit_MQTT_Library

Arduino library for MQTT support
MIT License
572 stars 291 forks source link

Adafruit_MQTT (API): the payload of publish method is read-only #114

Open flavio-fernandes opened 6 years ago

flavio-fernandes commented 6 years ago

The payload param provided in publish is a const. This change fixes the API to ensure caller that this is the case for all variations of the publish method.

This is a proposed fix to issue https://github.com/adafruit/Adafruit_MQTT_Library/issues/115

This change simply adds const to the proper data parameter, to ensure that the payload provided is not modified by the MQTT implementation. At the core of this codepath, the method memmove() is invoked and that is very okay since the src parameter is a const as well.

There are no limitations regarding this change. If caller passes in a non-const payload, the compiler will gladly handle it as a const anyway. So, this is 100% backwards compatible.

To test this change, simply call the publish method providing a const pointer. Example:

...
WiFiClient client;
Adafruit_MQTT_Client mqtt(&client, MQTT_SERVER, MQTT_PORT, MQTT_USERNAME, MQTT_PASSWORD);
Adafruit_MQTT_Publish service_pub = Adafruit_MQTT_Publish(&mqtt, "/topic/foo");

const uint8_t foo_payload = 0;
service_pub.publish(&foo_payload, 1 /*bLen*/));
...
flavio-fernandes commented 4 years ago

@Fapiko @brentru can you review this too? It is kinda related to https://github.com/adafruit/Adafruit_MQTT_Library/pull/169