From 024fd400d4698409427b6acffbce9d5f5525293a Mon Sep 17 00:00:00 2001 From: Tatsuzo Osawa Date: Fri, 5 Jan 2018 16:34:28 +0000 Subject: [PATCH] Fix Unsubscribe with No Topic Signed-off-by: Tatsuzo Osawa --- src/handle_unsubscribe.c | 6 +++ .../broker/02-unsubscribe-invalid-no-topic.py | 46 +++++++++++++++++++ test/broker/Makefile | 1 + 3 files changed, 53 insertions(+) create mode 100755 test/broker/02-unsubscribe-invalid-no-topic.py diff --git a/src/handle_unsubscribe.c b/src/handle_unsubscribe.c index d78e871c..be381c98 100644 --- a/src/handle_unsubscribe.c +++ b/src/handle_unsubscribe.c @@ -46,6 +46,12 @@ int handle__unsubscribe(struct mosquitto_db *db, struct mosquitto *context) } if(packet__read_uint16(&context->in_packet, &mid)) return 1; + if(context->protocol == mosq_p_mqtt311){ + if(context->in_packet.pos == context->in_packet.remaining_length){ + /* No topic specified, protocol error. */ + return MOSQ_ERR_PROTOCOL; + } + } while(context->in_packet.pos < context->in_packet.remaining_length){ sub = NULL; if(packet__read_string(&context->in_packet, &sub)){ diff --git a/test/broker/02-unsubscribe-invalid-no-topic.py b/test/broker/02-unsubscribe-invalid-no-topic.py new file mode 100755 index 00000000..e78bd1ad --- /dev/null +++ b/test/broker/02-unsubscribe-invalid-no-topic.py @@ -0,0 +1,46 @@ +#!/usr/bin/env python + +# Test whether a UNSUBSCRIBE with no topic results in a disconnect. MQTT-3.10.3-2 + +import inspect, os, sys +import struct + +def gen_unsubscribe_invalid_no_topic(mid): + pack_format = "!BBH" + return struct.pack(pack_format, 162, 2, mid) + +# From http://stackoverflow.com/questions/279237/python-import-a-module-from-a-folder +cmd_subfolder = os.path.realpath(os.path.abspath(os.path.join(os.path.split(inspect.getfile( inspect.currentframe() ))[0],".."))) +if cmd_subfolder not in sys.path: + sys.path.insert(0, cmd_subfolder) + +import mosq_test + +rc = 1 +mid = 3 +keepalive = 60 +connect_packet = mosq_test.gen_connect("unsubscribe-invalid-no-topic-test", keepalive=keepalive, proto_ver=4) +connack_packet = mosq_test.gen_connack(rc=0) + +unsubscribe_packet = gen_unsubscribe_invalid_no_topic(mid) + +cmd = ['../../src/mosquitto', '-p', '1888'] +broker = mosq_test.start_broker(filename=os.path.basename(__file__), cmd=cmd) + +try: + sock = mosq_test.do_client_connect(connect_packet, connack_packet) + sock.send(unsubscribe_packet) + + if mosq_test.expect_packet(sock, "disconnect", ""): + rc = 0 + + sock.close() +finally: + broker.terminate() + broker.wait() + if rc: + (stdo, stde) = broker.communicate() + print(stde) + +exit(rc) + diff --git a/test/broker/Makefile b/test/broker/Makefile index 85649a4f..ce59c6bb 100644 --- a/test/broker/Makefile +++ b/test/broker/Makefile @@ -41,6 +41,7 @@ endif ./02-unsubscribe-qos0.py ./02-unsubscribe-qos1.py ./02-unsubscribe-qos2.py + ./02-unsubscribe-invalid-no-topic.py 03 : ./03-publish-qos1.py