client/Process: explicitly disallow "idle" and "noidle" in command lists

These commands cannot possibly work with command lists because command
lists are supposed to be atomic, but suspended command execution
conflicts with that.

Closes https://github.com/MusicPlayerDaemon/MPD/issues/2167
This commit is contained in:
Max Kellermann
2025-01-29 16:07:39 +01:00
parent 8fcb6e148f
commit 0e8cd3b961
3 changed files with 18 additions and 0 deletions

1
NEWS
View File

@@ -1,6 +1,7 @@
ver 0.23.17 (not yet released)
* protocol
- "albumart" tries to send larger chunks if available
- explicitly disallow "idle" and "noidle" in command lists
* storage
- nfs: require libnfs 4.0 or later
* database

View File

@@ -156,6 +156,9 @@ fails, no more commands are executed and the appropriate
``list_OK`` is returned for each
successful command executed in the command list.
Only synchronous commands can be used in command lists. Commands that
suspend execution (``idle`` and ``noidle``) are not allowed.
Ranges
======

View File

@@ -52,6 +52,13 @@ Client::ProcessCommandList(bool list_ok,
return CommandResult::OK;
}
[[gnu::pure]]
static bool
IsAsyncCommmand(const char *line) noexcept
{
return StringIsEqual(line, "idle") || StringIsEqual(line, "noidle");
}
CommandResult
Client::ProcessLine(char *line) noexcept
{
@@ -67,6 +74,13 @@ Client::ProcessLine(char *line) noexcept
return CommandResult::CLOSE;
}
if (cmd_list.IsActive() && IsAsyncCommmand(line)) {
FmtWarning(client_domain,
"[{}] not possible in comand list: \"{}\"",
num, line);
return CommandResult::CLOSE;
}
if (StringIsEqual(line, "noidle")) {
if (idle_waiting) {
/* send empty idle response and leave idle mode */