diff options
author | Markus Armbruster <armbru@redhat.com> | 2010-06-08 13:54:26 +0200 |
---|---|---|
committer | Anthony Liguori <aliguori@us.ibm.com> | 2010-06-14 15:46:28 -0500 |
commit | b560a9ab9be06afcbb78b3791ab836dad208a239 (patch) | |
tree | cf1e0a4593b15effee04bcdf1c8383bd3a44a467 /qemu-option.c | |
parent | 1bb650420021ced718d550559034a5147c053068 (diff) |
qemu-option: Reject anti-social IDs
Restrict IDs to letters, digits, '-', '.', '_', starting with a
letter.
This takes care of '/' in qdev IDs breaking qbus_find().
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Diffstat (limited to 'qemu-option.c')
-rw-r--r-- | qemu-option.c | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/qemu-option.c b/qemu-option.c index f88486580c..7f70d0f5fb 100644 --- a/qemu-option.c +++ b/qemu-option.c @@ -673,11 +673,31 @@ QemuOpts *qemu_opts_find(QemuOptsList *list, const char *id) return NULL; } +static int id_wellformed(const char *id) +{ + int i; + + if (!qemu_isalpha(id[0])) { + return 0; + } + for (i = 1; id[i]; i++) { + if (!qemu_isalnum(id[i]) && !strchr("-._", id[i])) { + return 0; + } + } + return 1; +} + QemuOpts *qemu_opts_create(QemuOptsList *list, const char *id, int fail_if_exists) { QemuOpts *opts = NULL; if (id) { + if (!id_wellformed(id)) { + qerror_report(QERR_INVALID_PARAMETER_VALUE, "id", "an identifier"); + error_printf_unless_qmp("Identifiers consist of letters, digits, '-', '.', '_', starting with a letter.\n"); + return NULL; + } opts = qemu_opts_find(list, id); if (opts != NULL) { if (fail_if_exists) { |