diff --git a/include/libwebsockets/lws-mqtt.h b/include/libwebsockets/lws-mqtt.h index eb9dcbb2a..22865801e 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 6529fdc99..5324286e2 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 31f2aa2b7..a523e096a 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 8eb954240..5ff00c637 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 */