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:
1
NEWS
1
NEWS
@@ -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
|
||||
|
@@ -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
|
||||
======
|
||||
|
||||
|
@@ -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 */
|
||||
|
Reference in New Issue
Block a user