aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChunho Lee <chunhole@amazon.com>2021-10-26 17:45:11 -0700
committerAndy Green <andy@warmcat.com>2021-10-27 16:55:12 +0100
commitb843c09dc24a674ec1857e6fdead20693bb0da7a (patch)
tree231a59012f040561c83883cf525776edc39efc5a
parent00b7fa23d059743986ce573a62545ca67a8fb902 (diff)
downloadlibwebsockets-b843c09dc24a674ec1857e6fdead20693bb0da7a.tar.gz
mqtt: allow indicating username and password are not on heap
Fix minimal-mqtt-client and minimal-mqtt-client-multi from crashes by allowing indicating username and password are not on heap.
-rw-r--r--include/libwebsockets/lws-mqtt.h6
-rw-r--r--lib/roles/mqtt/client/client-mqtt.c10
-rw-r--r--minimal-examples/mqtt-client/minimal-mqtt-client-multi/minimal-mqtt-client-multi.c3
-rw-r--r--minimal-examples/mqtt-client/minimal-mqtt-client/minimal-mqtt-client.c7
4 files changed, 23 insertions, 3 deletions
diff --git a/include/libwebsockets/lws-mqtt.h b/include/libwebsockets/lws-mqtt.h
index eb9dcbb2..22865801 100644
--- a/include/libwebsockets/lws-mqtt.h
+++ b/include/libwebsockets/lws-mqtt.h
@@ -74,6 +74,10 @@ typedef struct lws_mqtt_client_connect_param_s {
session */
uint8_t client_id_nofree:1;
/**< do not free the client id */
+ uint8_t username_nofree:1;
+ /**< do not free the username */
+ uint8_t password_nofree:1;
+ /**< do not free the password */
struct {
const char *topic;
const char *message;
@@ -152,6 +156,8 @@ typedef enum {
/* flags from byte 8 of C_TO_S CONNECT */
typedef enum {
+ LMQCFT_USERNAME_NOFREE = (1 << 10),
+ LMQCFT_PASSWORD_NOFREE = (1 << 9),
LMQCFT_CLIENT_ID_NOFREE = (1 << 8),
/* only the low 8 are standardized and go out in the protocol */
LMQCFT_USERNAME = (1 << 7),
diff --git a/lib/roles/mqtt/client/client-mqtt.c b/lib/roles/mqtt/client/client-mqtt.c
index 6529fdc9..5324286e 100644
--- a/lib/roles/mqtt/client/client-mqtt.c
+++ b/lib/roles/mqtt/client/client-mqtt.c
@@ -122,6 +122,10 @@ lws_create_client_mqtt_object(const struct lws_client_connect_info *i,
c->conn_flags = LMQCFT_CLEAN_START;
if (cp->client_id_nofree)
c->conn_flags |= LMQCFT_CLIENT_ID_NOFREE;
+ if (cp->username_nofree)
+ c->conn_flags |= LMQCFT_USERNAME_NOFREE;
+ if (cp->password_nofree)
+ c->conn_flags |= LMQCFT_PASSWORD_NOFREE;
if (!(c->conn_flags & LMQCFT_CLIENT_ID_NOFREE))
lws_free((void *)cp->client_id);
@@ -152,14 +156,16 @@ lws_create_client_mqtt_object(const struct lws_client_connect_info *i,
if (!c->username)
goto oom3;
c->conn_flags |= LMQCFT_USERNAME;
- lws_free((void *)cp->username);
+ if (!(c->conn_flags & LMQCFT_USERNAME_NOFREE))
+ lws_free((void *)cp->username);
if (cp->password) {
c->password =
lws_mqtt_str_create_cstr_dup(cp->password, 0);
if (!c->password)
goto oom4;
c->conn_flags |= LMQCFT_PASSWORD;
- lws_free((void *)cp->password);
+ if (!(c->conn_flags & LMQCFT_PASSWORD_NOFREE))
+ lws_free((void *)cp->password);
}
}
diff --git a/minimal-examples/mqtt-client/minimal-mqtt-client-multi/minimal-mqtt-client-multi.c b/minimal-examples/mqtt-client/minimal-mqtt-client-multi/minimal-mqtt-client-multi.c
index 31f2aa2b..a523e096 100644
--- a/minimal-examples/mqtt-client/minimal-mqtt-client-multi/minimal-mqtt-client-multi.c
+++ b/minimal-examples/mqtt-client/minimal-mqtt-client-multi/minimal-mqtt-client-multi.c
@@ -53,6 +53,9 @@ static const lws_mqtt_client_connect_param_t client_connect_param = {
.client_id = NULL,
.keep_alive = 60,
.clean_start = 1,
+ .client_id_nofree = 1,
+ .username_nofree = 1,
+ .password_nofree = 1,
.will_param = {
.topic = "good/bye",
.message = "sign-off",
diff --git a/minimal-examples/mqtt-client/minimal-mqtt-client/minimal-mqtt-client.c b/minimal-examples/mqtt-client/minimal-mqtt-client/minimal-mqtt-client.c
index 8eb95424..5ff00c63 100644
--- a/minimal-examples/mqtt-client/minimal-mqtt-client/minimal-mqtt-client.c
+++ b/minimal-examples/mqtt-client/minimal-mqtt-client/minimal-mqtt-client.c
@@ -42,6 +42,8 @@ static const lws_mqtt_client_connect_param_t client_connect_param = {
.keep_alive = 60,
.clean_start = 1,
.client_id_nofree = 1,
+ .username_nofree = 1,
+ .password_nofree = 1,
.will_param = {
.topic = "good/bye",
.message = "sign-off",
@@ -184,6 +186,7 @@ callback_mqtt(struct lws *wsi, enum lws_callback_reasons reason,
case LWS_CALLBACK_MQTT_SUBSCRIBED:
lwsl_user("%s: MQTT_SUBSCRIBED\n", __func__);
+ lws_callback_on_writable(wsi);
break;
case LWS_CALLBACK_MQTT_CLIENT_WRITEABLE:
@@ -250,8 +253,10 @@ callback_mqtt(struct lws *wsi, enum lws_callback_reasons reason,
*/
pss->state++;
- if (pss->state != STATE_TEST_FINISH)
+ if (pss->state != STATE_TEST_FINISH) {
+ lws_callback_on_writable(wsi);
break;
+ }
/* Oh we are done then */