diff options
author | Eric Wong <normalperson@yhbt.net> | 2008-09-29 13:18:35 +0200 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2008-09-29 13:18:35 +0200 |
commit | 5f0ed72c489fd1f0b3c38e3608d27966e1f41f88 (patch) | |
tree | 4ed5095627a2ff53fd9f1375248673ff1120b2cf | |
parent | 11245dc1195c47f425471da927af7da0bca60c3e (diff) | |
download | mpd-5f0ed72c489fd1f0b3c38e3608d27966e1f41f88.tar.gz mpd-5f0ed72c489fd1f0b3c38e3608d27966e1f41f88.tar.xz mpd-5f0ed72c489fd1f0b3c38e3608d27966e1f41f88.zip |
command: don't clobber next list value when preparsing
This only breaks "update" under list command mode and
no other commands. This can be done more optimally
without the extra heap allocation via xstrdup(); but is
uncommon enough to not matter.
-rw-r--r-- | src/command.c | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/src/command.c b/src/command.c index 6ebcb977c..882d968d3 100644 --- a/src/command.c +++ b/src/command.c @@ -1422,16 +1422,19 @@ static CommandEntry *getCommandEntryAndCheckArgcAndPermission(struct client *cli static CommandEntry *getCommandEntryFromString(char *string, int permission) { - CommandEntry *cmd; + CommandEntry *cmd = NULL; char *argv[COMMAND_ARGV_MAX] = { NULL }; - int argc = buffer2array(string, argv, COMMAND_ARGV_MAX); + char *duplicated = xstrdup(string); + int argc = buffer2array(duplicated, argv, COMMAND_ARGV_MAX); if (0 == argc) - return NULL; + goto out; cmd = getCommandEntryAndCheckArgcAndPermission(0, permission, argc, argv); +out: + free(duplicated); return cmd; } |