modules: protect against invalid input and 0 division

Don't crash when the AEC reported latency is invalid.

Check that the parsed values make sense and avoid division by 0.
This commit is contained in:
Wim Taymans 2026-05-01 12:42:53 +02:00
parent 6f6b58785e
commit a4fb06073c

View file

@ -1587,19 +1587,27 @@ int pipewire__module_init(struct pw_impl_module *module, const char *args)
goto error;
}
unsigned int num = 0, denom = 1;
if (impl->aec->latency) {
unsigned int num, denom, req_num, req_denom;
if (sscanf(impl->aec->latency, "%u/%u", &num, &denom) != 2) {
pw_log_warn("Invalid AEC latency '%s', assuming 0", impl->aec->latency);
num = 0;
denom = 1;
}
}
if (num != 0 && denom != 0) {
unsigned int req_num = 0, req_denom = 1;
unsigned int factor = 0;
unsigned int new_num = 0;
spa_assert_se(sscanf(impl->aec->latency, "%u/%u", &num, &denom) == 2);
if ((str = pw_properties_get(props, PW_KEY_NODE_LATENCY)) != NULL) {
sscanf(str, "%u/%u", &req_num, &req_denom);
factor = (req_num * denom) / (req_denom * num);
new_num = req_num / factor * factor;
if (sscanf(str, "%u/%u", &req_num, &req_denom) == 2 &&
req_denom != 0) {
factor = (req_num * denom) / (req_denom * num);
new_num = req_num / factor * factor;
}
}
if (factor == 0 || new_num == 0) {
pw_log_info("Setting node latency to %s", impl->aec->latency);
pw_properties_set(props, PW_KEY_NODE_LATENCY, impl->aec->latency);