If multiple receivers are given, we leak the config structure of
all but the last one.
Clean up a comment further down in the function while we're at it.
ret = get_audio_format_num(arg);
if (ret < 0)
goto out;
ret = get_audio_format_num(arg);
if (ret < 0)
goto out;
+ /*
+ * If multiple receivers are given for this audio format, the
+ * last one wins and we have to free the previous receiver
+ * config here. Since we are iterating backwards, the winning
+ * receiver arg is in fact the first one given.
+ */
+ if (afi[ret].receiver_conf)
+ afi[ret].receiver->free_config(afi[ret].receiver_conf);
afi[ret].receiver_conf = check_receiver_arg(recv_arg, &receiver_num);
if (!afi[ret].receiver_conf) {
ret = -E_RECV_SYNTAX;
afi[ret].receiver_conf = check_receiver_arg(recv_arg, &receiver_num);
if (!afi[ret].receiver_conf) {
ret = -E_RECV_SYNTAX;
}
afi[ret].receiver = &receivers[receiver_num];
}
}
afi[ret].receiver = &receivers[receiver_num];
}
- /* use the first available receiver with no arguments
- * for those audio formats for which no receiver
- * was specified
+ /*
+ * Use the first available receiver with no arguments for those audio
+ * formats for which no receiver was specified.
*/
cmd = para_strdup(receivers[0].name);
FOR_EACH_AUDIO_FORMAT(i) {
*/
cmd = para_strdup(receivers[0].name);
FOR_EACH_AUDIO_FORMAT(i) {