diff --git a/ChangeLog.txt b/ChangeLog.txt index 348595fc..cff2a285 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -6,6 +6,7 @@ Broker: - Fix LWT messages not being delivered if `per_listener_settings` was set to true. Closes #2314. - Various fixes around inflight quota management. Closes #2306. +- Fix problem parsing config files with Windows line endings. Closes #2297. 2.0.12 - 2021-08-31 diff --git a/src/conf.c b/src/conf.c index 559eb553..22b85097 100644 --- a/src/conf.c +++ b/src/conf.c @@ -757,6 +757,10 @@ static int config__read_file_core(struct mosquitto__config *config, bool reload, } while((*buf)[slen-1] == 10 || (*buf)[slen-1] == 13){ (*buf)[slen-1] = 0; + slen = strlen(*buf); + if(slen == 0){ + continue; + } } token = strtok_r((*buf), " ", &saveptr); if(token){ diff --git a/test/broker/01-connect-windows-line-endings.py b/test/broker/01-connect-windows-line-endings.py new file mode 100755 index 00000000..17932b8a --- /dev/null +++ b/test/broker/01-connect-windows-line-endings.py @@ -0,0 +1,49 @@ +#!/usr/bin/env python3 + +# Test whether config files with windows line endings are accepted. +# This just connects anonymously - if the config file causes a failure, the +# broker won't start so the connection would fail. + +from mosq_test_helper import * + +def write_config(filename, port): + with open(filename, 'w') as f: + f.write("listener %d\r\n" % (port)) + f.write("allow_anonymous true\r\n") + +def do_test(): + port = mosq_test.get_port() + conf_file = os.path.basename(__file__).replace('.py', '.conf') + write_config(conf_file, port) + + broker = mosq_test.start_broker(filename=os.path.basename(__file__), use_conf=True, port=port) + + try: + for proto_ver in [4, 5]: + rc = 1 + keepalive = 10 + connect_packet = mosq_test.gen_connect("connect-anon-test-%d" % (proto_ver), keepalive=keepalive, proto_ver=proto_ver) + + if proto_ver == 5: + connack_packet = mosq_test.gen_connack(rc=0, proto_ver=proto_ver) + else: + connack_packet = mosq_test.gen_connack(rc=0, proto_ver=proto_ver) + + sock = mosq_test.do_client_connect(connect_packet, connack_packet, port=port) + sock.close() + rc = 0 + except mosq_test.TestError: + pass + finally: + os.remove(conf_file) + broker.terminate() + broker.wait() + (stdo, stde) = broker.communicate() + if rc: + print(stde.decode('utf-8')) + print("proto_ver=%d" % (proto_ver)) + exit(rc) + + +do_test() +exit(0) diff --git a/test/broker/Makefile b/test/broker/Makefile index 689ab606..7fc9752e 100644 --- a/test/broker/Makefile +++ b/test/broker/Makefile @@ -32,6 +32,7 @@ msg_sequence_test: ./01-connect-uname-or-anon.py ./01-connect-uname-password-denied-no-will.py ./01-connect-uname-password-denied.py + ./01-connect-windows-line-endings.py ./01-connect-zero-length-id.py diff --git a/test/broker/test.py b/test/broker/test.py index ec461c1b..25351e4e 100755 --- a/test/broker/test.py +++ b/test/broker/test.py @@ -14,6 +14,7 @@ tests = [ (1, './01-connect-uname-or-anon.py'), (1, './01-connect-uname-password-denied-no-will.py'), (1, './01-connect-uname-password-denied.py'), + (1, './01-connect-windows-line-endings.py'), (2, './01-connect-zero-length-id.py'), (1, './02-shared-qos0-v5.py'),