command/all: don't create new Response instance in exception handler

The new Response instance in the `catch` block didn't have the
`command` attribute set, so the error response didn't indicate which
command had failed, which however is required in the MPD protocol.

Closes https://github.com/MusicPlayerDaemon/MPD/issues/628
This commit is contained in:
Max Kellermann 2019-08-20 20:31:36 +02:00
parent 9bff5f9e36
commit 6c9f9c136b
2 changed files with 26 additions and 23 deletions

2
NEWS
View File

@ -6,6 +6,8 @@ ver 0.21.14 (not yet released)
* player * player
- fix crash after song change - fix crash after song change
- fix seek position after restarting the decoder - fix seek position after restarting the decoder
* protocol
- include command name in error responses
ver 0.21.13 (2019/08/06) ver 0.21.13 (2019/08/06)
* input * input

View File

@ -363,7 +363,7 @@ command_checked_lookup(Response &r, unsigned permission,
CommandResult CommandResult
command_process(Client &client, unsigned num, char *line) noexcept command_process(Client &client, unsigned num, char *line) noexcept
try { {
Response r(client, num); Response r(client, num);
/* get the command name (first word on the line) */ /* get the command name (first word on the line) */
@ -391,6 +391,7 @@ try {
char *argv[COMMAND_ARGV_MAX]; char *argv[COMMAND_ARGV_MAX];
Request args(argv, 0); Request args(argv, 0);
try {
/* now parse the arguments (quoted or unquoted) */ /* now parse the arguments (quoted or unquoted) */
while (true) { while (true) {
@ -415,8 +416,8 @@ try {
return CommandResult::ERROR; return CommandResult::ERROR;
return cmd->handler(client, args, r); return cmd->handler(client, args, r);
} catch (...) { } catch (...) {
Response r(client, num);
PrintError(r, std::current_exception()); PrintError(r, std::current_exception());
return CommandResult::ERROR; return CommandResult::ERROR;
}
} }