Skip to content

Commit 9b6f004

Browse files
committed
Broker: Fix parsing of ints in config. Add extra config test cases.
1 parent 8eaf299 commit 9b6f004

File tree

5 files changed

+33
-12
lines changed

5 files changed

+33
-12
lines changed

src/conf.c

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2005,7 +2005,7 @@ static int config__read_file_core(struct mosquitto__config *config, bool reload,
20052005
}else if(!strcmp(token, "max_packet_size")){
20062006
if(conf__parse_int(&token, "max_packet_size", &tmp_int, &saveptr)) return MOSQ_ERR_INVAL;
20072007
if(tmp_int < 20){
2008-
log__printf(NULL, MOSQ_LOG_ERR, "Error: Invalid 'max_packet_size' value (%d).", tmp_int);
2008+
log__printf(NULL, MOSQ_LOG_ERR, "Error: 'max_packet_size' must be >= 20.");
20092009
return MOSQ_ERR_INVAL;
20102010
}
20112011
config->max_packet_size = (uint32_t)tmp_int;
@@ -2696,7 +2696,17 @@ static int conf__parse_int(char **token, const char *name, int *value, char **sa
26962696
{
26972697
*token = strtok_r(NULL, " ", saveptr);
26982698
if(*token){
2699-
*value = atoi(*token);
2699+
char *endptr = NULL;
2700+
long l = strtol(*token, &endptr, 0);
2701+
if(endptr == *token || endptr[0] != '\0'){
2702+
log__printf(NULL, MOSQ_LOG_ERR, "Error: '%s' value not a number.", name);
2703+
return MOSQ_ERR_INVAL;
2704+
}
2705+
if(l > INT_MAX || l < INT_MIN){
2706+
log__printf(NULL, MOSQ_LOG_ERR, "Error: '%s' value out of range.", name);
2707+
return MOSQ_ERR_INVAL;
2708+
}
2709+
*value = (int)l;
27002710
}else{
27012711
log__printf(NULL, MOSQ_LOG_ERR, "Error: Empty '%s' value in configuration.", name);
27022712
return MOSQ_ERR_INVAL;

test/broker/15-persist-migrate-db.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ def do_failure_test(create_db_of_version: list[int]):
6666
port=port,
6767
rc_expected=3,
6868
error_log_entry=f"Unknown database_schema version {'.'.join([str(i) for i in create_db_of_version])}",
69+
with_test_config=False,
6970
)
7071
except Exception as exc:
7172
print(f"Exception: {str(exc)}")

test/broker/16-config-parse-errors-tls.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,14 @@
1919
do_test_broker_failure(conf_file, [f"listener {port}","certfile"], port, 3) # empty certfile
2020
do_test_broker_failure(conf_file, [f"listener {port}","keyfile"], port, 3) # empty keyfile
2121

22-
do_test_broker_failure(conf_file, [f"listener {port}","certfile ./16-config-parse-errors.py","keyfile ../ssl/server.key"], port, 1) # invalid certfile
23-
do_test_broker_failure(conf_file, [f"listener {port}","certfile ../ssl/server.crt","keyfile ./16-config-parse-errors.py"], port, 1) # invalid keyfile
24-
do_test_broker_failure(conf_file, [f"listener {port}","certfile ../ssl/server.crt","keyfile ../ssl/client.key"], port, 1) # mismatched certfile / keyfile
22+
do_test_broker_failure(conf_file, [f"listener {port}","certfile ./16-config-parse-errors.py","keyfile ../ssl/server.key"], port, 1, with_test_config=False) # invalid certfile
23+
do_test_broker_failure(conf_file, [f"listener {port}","certfile ../ssl/server.crt","keyfile ./16-config-parse-errors.py"], port, 1, with_test_config=False) # invalid keyfile
24+
do_test_broker_failure(conf_file, [f"listener {port}","certfile ../ssl/server.crt","keyfile ../ssl/client.key"], port, 1, with_test_config=False) # mismatched certfile / keyfile
2525

26-
do_test_broker_failure(conf_file, [f"listener {port}","certfile ../ssl/server.crt","keyfile ../ssl/server.key","tls_version invalid"], port, 1) # invalid tls_version
26+
do_test_broker_failure(conf_file, [f"listener {port}","certfile ../ssl/server.crt","keyfile ../ssl/server.key","tls_version invalid"], port, 1, with_test_config=False) # invalid tls_version
2727

28-
do_test_broker_failure(conf_file, [f"listener {port}","certfile ../ssl/server.crt","keyfile ../ssl/server.key","crlfile invalid"], port, 1) # missing crl file
29-
do_test_broker_failure(conf_file, [f"listener {port}","certfile ../ssl/server.crt","keyfile ../ssl/server.key","ciphers invalid"], port, 1) # invalid ciphers
30-
do_test_broker_failure(conf_file, [f"listener {port}","certfile ../ssl/server.crt","keyfile ../ssl/server.key","ciphers_tls1.3 invalid"], port, 1) # invalid ciphers_tls1.3
28+
do_test_broker_failure(conf_file, [f"listener {port}","certfile ../ssl/server.crt","keyfile ../ssl/server.key","crlfile invalid"], port, 1, with_test_config=False) # missing crl file
29+
do_test_broker_failure(conf_file, [f"listener {port}","certfile ../ssl/server.crt","keyfile ../ssl/server.key","ciphers invalid"], port, 1, with_test_config=False) # invalid ciphers
30+
do_test_broker_failure(conf_file, [f"listener {port}","certfile ../ssl/server.crt","keyfile ../ssl/server.key","ciphers_tls1.3 invalid"], port, 1, with_test_config=False) # invalid ciphers_tls1.3
3131

3232
exit(0)

test/broker/16-config-parse-errors-without-tls.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,12 @@
1919
do_test_broker_failure(conf_file, ["allow_anonymous falst"], port, 3, "Error: Invalid 'allow_anonymous' value (falst).") # Invalid bool
2020

2121
do_test_broker_failure(conf_file, ["autosave_interval"], port, 3, "Error: Empty 'autosave_interval' value in configuration.") # Empty int
22-
#do_test_broker_failure(conf_file, ["autosave_interval string"], port, 3, "bla") # Invalid int
22+
do_test_broker_failure(conf_file, ["autosave_interval string"], port, 3, "Error: 'autosave_interval' value not a number.") # Invalid int
2323
do_test_broker_failure(conf_file, ["listener"], port, 3, "Error: Empty 'listener port' value in configuration.") # Empty listener
2424
do_test_broker_failure(conf_file, ["mount_point test/"], port, 3, "Error: The 'mount_point' option requires a listener to be defined first.") # Missing listener config
2525
do_test_broker_failure(conf_file, [f"listener {port}","mount_point test/+/"], port, 3, "Error: Invalid 'mount_point' value (test/+/). Does it contain a wildcard character?") # Wildcard in mount point.
26+
do_test_broker_failure(conf_file, [f"listener 100000"], port, 3, "Error: Invalid 'port' value (100000).") # Out of range
27+
do_test_broker_failure(conf_file, [f"listener 0"], port, 3, "Error: A listener with port 0 must provide a Unix socket path.") # Missing unix socket
2628
do_test_broker_failure(conf_file, [f"listener {port}","protocol"], port, 3, "Error: Empty 'protocol' value in configuration.") # Empty proto
2729
do_test_broker_failure(conf_file, [f"listener {port}","protocol test"], port, 3, "Error: Invalid 'protocol' value (test).") # Invalid proto
2830
do_test_broker_failure(conf_file, [f"listener {port}","accept_protocol_versions"], port, 3, "Error: Empty 'accept_protocol_versions' value in configuration.")
@@ -70,6 +72,9 @@
7072

7173
do_test_broker_failure(conf_file, ["max_inflight_messages 65536"], port, 3, "Error: 'max_inflight_messages' must be <= 65535.") # Invalid value
7274

75+
do_test_broker_failure(conf_file, ["max_packet_size 19"], port, 3, "Error: 'max_packet_size' must be >= 20.") # Invalid value
76+
do_test_broker_failure(conf_file, ["message_size_limit 556000000"], port, 3, "Error: Invalid 'message_size_limit' value (556000000).") # Invalid value
77+
7378
do_test_broker_failure(conf_file, ["max_keepalive 65536"], port, 3, "Error: Invalid 'max_keepalive' value (65536).") # Invalid value
7479
do_test_broker_failure(conf_file, ["max_keepalive -1"], port, 3, "Error: Invalid 'max_keepalive' value (-1).") # Invalid value
7580

test/broker/mosq_test_helper.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,15 @@ def do_test_broker_failure(
4343
rc_expected: int,
4444
error_log_entry: str = None,
4545
stdout_entry: str = None,
46-
cmd_args: list = None,
46+
cmd_args: list = [],
47+
with_test_config: bool = True,
4748
):
4849
rc = 1
4950

51+
cmd_args = cmd_args.copy()
52+
if with_test_config:
53+
cmd_args.insert(0, "--test-config")
54+
5055
use_conf_file = len(conf_file)
5156
create_conf_file = use_conf_file and len(config)
5257
if create_conf_file:
@@ -100,7 +105,7 @@ def do_test_broker_failure(
100105
pass
101106
if rc:
102107
print(
103-
f"While testing 'config {chr(10).join(config) if len(config) else ''}'{', args'+ ' '.join(cmd_args) if cmd_args is not None else ''}"
108+
f"While testing 'config {chr(10).join(config) if len(config) else ''}'{', args '+ ' '.join(cmd_args) if cmd_args is not None else ''}"
104109
)
105110
exit(rc)
106111

0 commit comments

Comments
 (0)