diff options
author | Chunho Lee <chunhole@amazon.com> | 2021-10-26 17:45:11 -0700 |
---|---|---|
committer | Andy Green <andy@warmcat.com> | 2021-10-27 16:55:12 +0100 |
commit | b843c09dc24a674ec1857e6fdead20693bb0da7a (patch) | |
tree | 231a59012f040561c83883cf525776edc39efc5a | |
parent | 00b7fa23d059743986ce573a62545ca67a8fb902 (diff) | |
download | libwebsockets-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.
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 */ |