diff --git a/src/handle_publish.c b/src/handle_publish.c index 148e7174..8defeb42 100644 --- a/src/handle_publish.c +++ b/src/handle_publish.c @@ -163,7 +163,12 @@ int handle__publish(struct mosquitto_db *db, struct mosquitto *context) if(rc) return rc; }else if(topic == NULL && topic_alias){ rc = alias__find(context, &topic, topic_alias); - if(rc) return rc; + if(rc){ + if(context->protocol == mosq_p_mqtt5){ + send__disconnect(context, MQTT_RC_TOPIC_ALIAS_INVALID, NULL); + } + return rc; + } }else if(topic == NULL && topic_alias == 0){ return MOSQ_ERR_PROTOCOL; } diff --git a/test/broker/02-subpub-qos0-topic-alias-unknown.py b/test/broker/02-subpub-qos0-topic-alias-unknown.py new file mode 100755 index 00000000..a79c19e2 --- /dev/null +++ b/test/broker/02-subpub-qos0-topic-alias-unknown.py @@ -0,0 +1,37 @@ +#!/usr/bin/env python + +# Test whether "topic alias" works to the broker +# MQTT v5 + +from mosq_test_helper import * + +rc = 1 +keepalive = 60 +connect_packet = mosq_test.gen_connect("sub-test", keepalive=keepalive, proto_ver=5) +connack_packet = mosq_test.gen_connack(rc=0, proto_ver=5) + +props = mqtt5_props.gen_uint16_prop(mqtt5_props.PROP_TOPIC_ALIAS, 3) +publish1_packet = mosq_test.gen_publish("", qos=0, payload="message", proto_ver=5, properties=props) + +disconnect_packet = mosq_test.gen_disconnect(reason_code=148, proto_ver=5) + +port = mosq_test.get_port() +broker = mosq_test.start_broker(filename=os.path.basename(__file__), port=port) + +try: + sock = mosq_test.do_client_connect(connect_packet, connack_packet, timeout=5, port=port) + sock.send(publish1_packet) + + if mosq_test.expect_packet(sock, "disconnect", disconnect_packet): + rc = 0 + + sock.close() +finally: + broker.terminate() + broker.wait() + (stdo, stde) = broker.communicate() + if rc: + print(stde) + +exit(rc) + diff --git a/test/broker/Makefile b/test/broker/Makefile index ecf35df3..790f2de3 100644 --- a/test/broker/Makefile +++ b/test/broker/Makefile @@ -64,6 +64,7 @@ endif ./02-subpub-qos2-receive-maximum-2.py ./02-subpub-qos2-pubrec-error.py ./02-subpub-qos0-topic-alias.py + ./02-subpub-qos0-topic-alias-unknown.py ./02-unsubscribe-qos0.py ./02-unsubscribe-qos1.py ./02-unsubscribe-qos2.py diff --git a/test/broker/ptest.py b/test/broker/ptest.py index 441946fc..60fdad43 100755 --- a/test/broker/ptest.py +++ b/test/broker/ptest.py @@ -47,6 +47,7 @@ tests = [ (1, './02-subpub-qos2-receive-maximum-2.py'), (1, './02-subpub-qos2-pubrec-error.py'), (1, './02-subpub-qos0-topic-alias.py'), + (1, './02-subpub-qos0-topic-alias-unknown.py'), (1, './02-unsubscribe-qos0.py'), (1, './02-unsubscribe-qos1.py'), (1, './02-unsubscribe-qos2.py'), diff --git a/test/mosq_test.py b/test/mosq_test.py index c278cfbb..f3a9d973 100644 --- a/test/mosq_test.py +++ b/test/mosq_test.py @@ -483,9 +483,7 @@ def gen_unsubscribe_multiple(mid, topics, proto_ver=4): remaining_length = 0 for t in topics: remaining_length += 2+len(t) - print(t) packet += struct.pack("!H"+str(len(t))+"s", len(t), t) - print(packet) if proto_ver == 5: remaining_length += 2+1