Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions lib/actions_subscribe.c
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,11 @@ int mosquitto_subscribe_multiple(struct mosquitto *mosq, int *mid, int sub_count
if(mosquitto_validate_utf8(sub[i], slen)){
return MOSQ_ERR_MALFORMED_UTF8;
}
if(!mosq->wildcard_sub_available){
if(strchr(sub[i], '+') || strchr(sub[i], '#')){
return MOSQ_ERR_WILDCARD_SUBS_NOT_SUPPORTED;
}
}
Comment on lines +93 to +97
remaining_length += 2+(uint32_t)slen + 1;
}

Expand Down
1 change: 1 addition & 0 deletions lib/connect.c
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,7 @@ static int mosquitto__connect_init(struct mosquitto *mosq, const char *host, int
mosq->msgs_in.inflight_quota = mosq->msgs_in.inflight_maximum;
mosq->msgs_out.inflight_quota = mosq->msgs_out.inflight_maximum;
mosq->retain_available = 1;
mosq->wildcard_sub_available = 1;
mosquitto__set_request_disconnect(mosq, false);

return MOSQ_ERR_SUCCESS;
Expand Down
1 change: 1 addition & 0 deletions lib/handle_connack.c
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,7 @@ int handle__connack(struct mosquitto *mosq)
}

mosquitto_property_read_byte(properties, MQTT_PROP_RETAIN_AVAILABLE, &mosq->retain_available, false);
mosquitto_property_read_byte(properties, MQTT_PROP_WILDCARD_SUB_AVAILABLE, &mosq->wildcard_sub_available, false);
mosquitto_property_read_byte(properties, MQTT_PROP_MAXIMUM_QOS, &mosq->max_qos, false);
mosquitto_property_read_int16(properties, MQTT_PROP_RECEIVE_MAXIMUM, &mosq->msgs_out.inflight_maximum, false);
mosquitto_property_read_int16(properties, MQTT_PROP_SERVER_KEEP_ALIVE, &mosq->keepalive, false);
Expand Down
1 change: 1 addition & 0 deletions lib/libmosquitto.c
Original file line number Diff line number Diff line change
Expand Up @@ -206,6 +206,7 @@ int mosquitto_reinitialise(struct mosquitto *mosq, const char *id, bool clean_st
mosq->last_mid = 0;
mosq->state = mosq_cs_new;
mosq->max_qos = 2;
mosq->wildcard_sub_available = 1;
mosq->msgs_in.inflight_maximum = 20;
mosq->msgs_out.inflight_maximum = 20;
mosq->msgs_in.inflight_quota = 20;
Expand Down
1 change: 1 addition & 0 deletions lib/mosquitto_internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -451,6 +451,7 @@ struct mosquitto {
#endif
uint8_t max_qos;
uint8_t retain_available;
uint8_t wildcard_sub_available;
bool tcp_nodelay;
#if defined(WITH_WEBSOCKETS) && WITH_WEBSOCKETS == WS_IS_BUILTIN
char *http_request;
Expand Down
92 changes: 92 additions & 0 deletions test/lib/c/02-subscribe-wildcard-unavailable-v5.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <mosquitto.h>

static int run = -1;


static void on_connect(struct mosquitto *mosq, void *obj, int rc)
{
(void)obj;

if(rc){
exit(1);
}else{
Comment thread
ryzhov-artem marked this conversation as resolved.
/* Wildcard subscribe must be rejected client-side: CONNACK said = 0 */
rc = mosquitto_subscribe(mosq, NULL, "wildcard/+/rejected", 0);
if(rc != MOSQ_ERR_WILDCARD_SUBS_NOT_SUPPORTED){
run = 1;
return;
}
rc = mosquitto_subscribe(mosq, NULL, "wildcard/#", 0);
if(rc != MOSQ_ERR_WILDCARD_SUBS_NOT_SUPPORTED){
run = 1;
return;
}
/* Plain topic must succeed */
rc = mosquitto_subscribe(mosq, NULL, "plain/topic", 0);
if(rc != MOSQ_ERR_SUCCESS){
run = 1;
}
}
}


static void on_subscribe(struct mosquitto *mosq, void *obj, int mid, int qos_count, const int *granted_qos)
{
(void)obj;
(void)mid;
(void)qos_count;
(void)granted_qos;

mosquitto_disconnect(mosq);
}


static void on_disconnect(struct mosquitto *mosq, void *obj, int rc)
{
(void)mosq;
(void)obj;
(void)rc;

run = 0;
}


int main(int argc, char *argv[])
{
int rc;
struct mosquitto *mosq;
int port;

if(argc < 2){
return 1;
}
port = atoi(argv[1]);

mosquitto_lib_init();

mosq = mosquitto_new("subscribe-wildcard-unavailable-test", true, NULL);
if(mosq == NULL){
return 1;
}
Comment on lines +71 to +74
mosquitto_int_option(mosq, MOSQ_OPT_PROTOCOL_VERSION, MQTT_PROTOCOL_V5);
mosquitto_connect_callback_set(mosq, on_connect);
mosquitto_subscribe_callback_set(mosq, on_subscribe);
mosquitto_disconnect_callback_set(mosq, on_disconnect);

rc = mosquitto_connect(mosq, "localhost", port, 60);
if(rc != MOSQ_ERR_SUCCESS){
return rc;
}
Comment on lines +80 to +83

while(run == -1){
mosquitto_loop(mosq, 50, 1);
}
Comment on lines +85 to +87

mosquitto_destroy(mosq);
mosquitto_lib_cleanup();
return run;
}