From: Luiz Augusto von Dentz <luiz.dentz@gmail.com>
To: linux-bluetooth@vger.kernel.org
Subject: [PATCH BlueZ 1/3] shared/shell: Detect if the arguments are properly set
Date: Wed, 22 Nov 2017 15:00:17 +0200 [thread overview]
Message-ID: <20171122130019.14173-1-luiz.dentz@gmail.com> (raw)
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
Parse arguments to detect if user has passed a valid number of
arguments.
---
src/shared/shell.c | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++----
1 file changed, 92 insertions(+), 6 deletions(-)
diff --git a/src/shared/shell.c b/src/shared/shell.c
index c271a53ee..73aedaf79 100644
--- a/src/shared/shell.c
+++ b/src/shared/shell.c
@@ -207,6 +207,95 @@ static void shell_print_menu(void)
}
}
+static int parse_args(char *arg, wordexp_t *w, char *del, int flags)
+{
+ char *str;
+
+ str = g_strdelimit(arg, del, '"');
+
+ if (wordexp(str, w, flags)) {
+ g_free(str);
+ return -EINVAL;
+ }
+
+ /* If argument ends with ,,, set we_offs bypass strict checks */
+ if (w->we_wordc && g_str_has_suffix(w->we_wordv[w->we_wordc -1], "..."))
+ w->we_offs = 1;
+
+ g_free(str);
+
+ return 0;
+}
+
+static int cmd_exec(const struct bt_shell_menu_entry *entry,
+ int argc, char *argv[])
+{
+ wordexp_t w;
+ size_t len;
+ char *man, *opt;
+ int flags = WRDE_NOCMD;
+
+ if (!entry->arg || entry->arg[0] == '\0') {
+ if (argc) {
+ print_text(COLOR_HIGHLIGHT, "Too many arguments");
+ return -EINVAL;
+ }
+ goto exec;
+ }
+
+ /* Find last mandatory arguments */
+ man = strrchr(entry->arg, '>');
+ if (!man) {
+ opt = strdup(entry->arg);
+ goto optional;
+ }
+
+ len = man - entry->arg;
+ man = strndup(entry->arg, len + 1);
+
+ if (parse_args(man, &w, "<>", flags) < 0) {
+ print_text(COLOR_HIGHLIGHT,
+ "Unable to parse mandatory command arguments");
+ return -EINVAL;
+ }
+
+ /* Check if there are enough arguments */
+ if ((unsigned) argc < w.we_wordc && !w.we_offs) {
+ print_text(COLOR_HIGHLIGHT, "Missing %s argument",
+ w.we_wordv[argc]);
+ goto fail;
+ }
+
+ flags |= WRDE_APPEND;
+ opt = strdup(entry->arg + len + 1);
+
+optional:
+ if (parse_args(opt, &w, "<>", flags) < 0) {
+ print_text(COLOR_HIGHLIGHT,
+ "Unable to parse mandatory command arguments");
+ return -EINVAL;
+ }
+
+ /* Check if there are too many arguments */
+ if ((unsigned) argc > w.we_wordc && !w.we_offs) {
+ print_text(COLOR_HIGHLIGHT, "Too many arguments: %d > %zu",
+ argc, w.we_wordc);
+ goto fail;
+ }
+
+ wordfree(&w);
+
+exec:
+ if (entry->func)
+ entry->func(argc, argv);
+
+ return 0;
+
+fail:
+ wordfree(&w);
+ return -EINVAL;
+}
+
static int menu_exec(const struct bt_shell_menu_entry *entry,
int argc, char *argv[])
{
@@ -222,10 +311,7 @@ static int menu_exec(const struct bt_shell_menu_entry *entry,
if (data.menu == data.main && !strcmp(entry->cmd, "back"))
continue;
- if (entry->func) {
- entry->func(argc - 1, ++argv);
- return 0;
- }
+ return cmd_exec(entry, --argc, ++argv);
}
return -ENOENT;
@@ -236,8 +322,8 @@ static void shell_exec(int argc, char *argv[])
if (!data.menu || !argv[0])
return;
- if (menu_exec(default_menu, argc, argv) < 0) {
- if (menu_exec(data.menu->entries, argc, argv) < 0)
+ if (menu_exec(default_menu, argc, argv) == -ENOENT) {
+ if (menu_exec(data.menu->entries, argc, argv) == -ENOENT)
print_text(COLOR_HIGHLIGHT, "Invalid command");
}
}
--
2.13.6
next reply other threads:[~2017-11-22 13:00 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-11-22 13:00 Luiz Augusto von Dentz [this message]
2017-11-22 13:00 ` [PATCH BlueZ 2/3] client: Remove argument checks Luiz Augusto von Dentz
2017-11-22 13:00 ` [PATCH BlueZ 3/3] client: Fix format of arguments of set-service and set-manufacturer Luiz Augusto von Dentz
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20171122130019.14173-1-luiz.dentz@gmail.com \
--to=luiz.dentz@gmail.com \
--cc=linux-bluetooth@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).