Skip to content

Commit

Permalink
Add UTF-8 tests, plus some validation fixes.
Browse files Browse the repository at this point in the history
Closes #693.
  • Loading branch information
ralight committed Apr 12, 2018
1 parent e961bc9 commit 729a093
Show file tree
Hide file tree
Showing 6 changed files with 154 additions and 5 deletions.
8 changes: 8 additions & 0 deletions src/handle_connect.c
Original file line number Diff line number Diff line change
Expand Up @@ -292,6 +292,14 @@ int handle__connect(struct mosquitto_db *db, struct mosquitto *context)
rc = 1;
goto handle_connect_error;
}
if(mosquitto_validate_utf8(will_topic, slen)){
log__printf(NULL, MOSQ_LOG_INFO,
"Malformed UTF-8 in will topic string from %s, disconnecting.",
client_id);

rc = 1;
goto handle_connect_error;
}

if(context->listener->mount_point){
slen = strlen(context->listener->mount_point) + strlen(will_topic) + 1;
Expand Down
11 changes: 6 additions & 5 deletions src/handle_publish.c
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,12 @@ int handle__publish(struct mosquitto_db *db, struct mosquitto *context)
mosquitto__free(topic);
return 1;
}

if(mosquitto_validate_utf8(topic, slen) != MOSQ_ERR_SUCCESS){
mosquitto__free(topic);
return 1;
}

#ifdef WITH_BRIDGE
if(context->bridge && context->bridge->topics && context->bridge->topic_remapping){
for(i=0; i<context->bridge->topic_count; i++){
Expand Down Expand Up @@ -122,11 +128,6 @@ int handle__publish(struct mosquitto_db *db, struct mosquitto *context)
return 1;
}

if(mosquitto_validate_utf8(topic, strlen(topic)) != MOSQ_ERR_SUCCESS){
mosquitto__free(topic);
return 1;
}

if(qos > 0){
if(packet__read_uint16(&context->in_packet, &mid)){
mosquitto__free(topic);
Expand Down
49 changes: 49 additions & 0 deletions test/broker/02-subscribe-invalid-utf8.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
#!/usr/bin/env python

# Test whether a SUBSCRIBE to a topic with an invalid UTF-8 topic fails

import time
import inspect, os, sys
# From https://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 struct
import mosq_test

rc = 1
mid = 53
keepalive = 60
connect_packet = mosq_test.gen_connect("subscribe-invalid-utf8", keepalive=keepalive)
connack_packet = mosq_test.gen_connack(rc=0)

subscribe_packet = mosq_test.gen_subscribe(mid, "invalid/utf8", 0)
b = list(struct.unpack("B"*len(subscribe_packet), subscribe_packet))
b[13] = 0 # Topic should never have a 0x0000
subscribe_packet = struct.pack("B"*len(b), *b)

suback_packet = mosq_test.gen_suback(mid, 0)

cmd = ['../../src/mosquitto', '-p', '1888']
broker = mosq_test.start_broker(filename=os.path.basename(__file__), cmd=cmd)

try:
time.sleep(0.5)

sock = mosq_test.do_client_connect(connect_packet, connack_packet)
sock.send(subscribe_packet)

if mosq_test.expect_packet(sock, "suback", ""):
rc = 0

sock.close()
finally:
broker.terminate()
broker.wait()
if rc:
(stdo, stde) = broker.communicate()
print(stde)

exit(rc)

49 changes: 49 additions & 0 deletions test/broker/03-publish-invalid-utf8.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
#!/usr/bin/env python

# Test whether a PUBLISH to a topic with an invalid UTF-8 topic fails

import time
import inspect, os, sys
# From https://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 struct
import mosq_test

rc = 1
mid = 53
keepalive = 60
connect_packet = mosq_test.gen_connect("publish-invalid-utf8", keepalive=keepalive)
connack_packet = mosq_test.gen_connack(rc=0)

publish_packet = mosq_test.gen_publish("invalid/utf8", 1, mid=mid)
b = list(struct.unpack("B"*len(publish_packet), publish_packet))
b[11] = 0 # Topic should never have a 0x0000
publish_packet = struct.pack("B"*len(b), *b)

puback_packet = mosq_test.gen_puback(mid)

cmd = ['../../src/mosquitto', '-p', '1888']
broker = mosq_test.start_broker(filename=os.path.basename(__file__), cmd=cmd)

try:
time.sleep(0.5)

sock = mosq_test.do_client_connect(connect_packet, connack_packet)
sock.send(publish_packet)

if mosq_test.expect_packet(sock, "puback", ""):
rc = 0

sock.close()
finally:
broker.terminate()
broker.wait()
if rc:
(stdo, stde) = broker.communicate()
print(stde)

exit(rc)

39 changes: 39 additions & 0 deletions test/broker/07-will-invalid-utf8.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
#!/usr/bin/env python

# Test whether a PUBLISH to a topic with an invalid UTF-8 topic fails

import time
import inspect, os, sys
# From https://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 struct
import mosq_test

rc = 1
mid = 53
keepalive = 60
connect_packet = mosq_test.gen_connect("will-invalid-utf8", keepalive=keepalive, will_topic="invalid/utf8")

b = list(struct.unpack("B"*len(connect_packet), connect_packet))
b[40] = 0 # Topic should never have a 0x0000
connect_packet = struct.pack("B"*len(b), *b)

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, "", timeout=30)
rc = 0
sock.close()
finally:
broker.terminate()
broker.wait()
if rc:
(stdo, stde) = broker.communicate()
print(stde)

exit(rc)

3 changes: 3 additions & 0 deletions test/broker/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ endif
./02-unsubscribe-qos1.py
./02-unsubscribe-qos2.py
./02-unsubscribe-invalid-no-topic.py
./02-subscribe-invalid-utf8.py

03 :
./03-publish-qos1.py
Expand All @@ -51,6 +52,7 @@ endif
./03-publish-b2c-disconnect-qos2.py
./03-pattern-matching.py
./03-publish-qos1-queued-bytes.py
./03-publish-invalid-utf8.py

04 :
./04-retain-qos0.py
Expand Down Expand Up @@ -78,6 +80,7 @@ endif
./07-will-qos0.py
./07-will-null.py
./07-will-null-topic.py
./07-will-invalid-utf8.py

08 :
ifeq ($(WITH_TLS),yes)
Expand Down

0 comments on commit 729a093

Please sign in to comment.