From 570b12ec1392dc6561b21c7bb8b653eb7a922a01 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Sun, 9 Feb 2014 08:05:02 +0100 Subject: Idle: error out when unrecognized idle event was specified Implements the error checks missing in commit 0bad8406 --- src/Idle.cxx | 13 +++++++++++++ src/Idle.hxx | 10 ++++++++++ src/command/OtherCommands.cxx | 17 +++++++++-------- 3 files changed, 32 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/src/Idle.cxx b/src/Idle.cxx index ed16bbecb..713454da5 100644 --- a/src/Idle.cxx +++ b/src/Idle.cxx @@ -25,6 +25,7 @@ #include "config.h" #include "Idle.hxx" #include "GlobalEvents.hxx" +#include "util/ASCII.hxx" #include @@ -70,3 +71,15 @@ idle_get_names(void) { return idle_names; } + +unsigned +idle_parse_name(const char *name) +{ + assert(name != nullptr); + + for (unsigned i = 0; idle_names[i] != nullptr; ++i) + if (StringEqualsCaseASCII(name, idle_names[i])) + return 1 << i; + + return 0; +} diff --git a/src/Idle.hxx b/src/Idle.hxx index 7fc79d10a..48f7a6aa0 100644 --- a/src/Idle.hxx +++ b/src/Idle.hxx @@ -25,6 +25,8 @@ #ifndef MPD_IDLE_HXX #define MPD_IDLE_HXX +#include "Compiler.h" + /** song database has been updated*/ static constexpr unsigned IDLE_DATABASE = 0x1; @@ -81,4 +83,12 @@ idle_get(void); const char*const* idle_get_names(void); +/** + * Parse an idle name and return its mask. Returns 0 if the given + * name is unknown. + */ +gcc_nonnull_all gcc_pure +unsigned +idle_parse_name(const char *name); + #endif diff --git a/src/command/OtherCommands.cxx b/src/command/OtherCommands.cxx index 3c0b6963a..b3564040c 100644 --- a/src/command/OtherCommands.cxx +++ b/src/command/OtherCommands.cxx @@ -33,7 +33,6 @@ #include "protocol/Result.hxx" #include "ls.hxx" #include "mixer/Volume.hxx" -#include "util/ASCII.hxx" #include "util/UriUtil.hxx" #include "util/Error.hxx" #include "fs/AllocatedPath.hxx" @@ -363,17 +362,19 @@ CommandResult handle_idle(Client &client, gcc_unused int argc, gcc_unused char *argv[]) { - unsigned flags = 0, j; + unsigned flags = 0; int i; - const char *const* idle_names; - idle_names = idle_get_names(); for (i = 1; i < argc; ++i) { - for (j = 0; idle_names[j]; ++j) { - if (StringEqualsCaseASCII(argv[i], idle_names[j])) { - flags |= (1 << j); - } + unsigned event = idle_parse_name(argv[i]); + if (event == 0) { + command_error(client, ACK_ERROR_ARG, + "Unrecognized idle event: %s", + argv[i]); + return CommandResult::ERROR; } + + flags |= event; } /* No argument means that the client wants to receive everything */ -- cgit v1.2.3