--- tools/virsh.c | 39 ++++++++++++++++++--------------------- 1 files changed, 18 insertions(+), 21 deletions(-) diff --git a/tools/virsh.c b/tools/virsh.c index 54684f6..d45baa6 100644 --- a/tools/virsh.c +++ b/tools/virsh.c @@ -12322,7 +12322,7 @@ static const vshCmdOptDef opts_echo[] = { * quotes for later evaluation. */ static bool -cmdEcho (vshControl *ctl ATTRIBUTE_UNUSED, const vshCmd *cmd) +cmdEcho (vshControl *ctl, const vshCmd *cmd) { bool shell = false; bool xml = false; @@ -12337,34 +12337,31 @@ cmdEcho (vshControl *ctl ATTRIBUTE_UNUSED, const vshCmd *cmd) xml = true; while ((opt = vshCommandOptArgv(cmd, opt))) { - bool close_quote = false; - char *q; + char *str; + virBuffer xmlbuf = VIR_BUFFER_INITIALIZER; arg = opt->data; + if (count) virBufferAddChar(&buf, ' '); - /* Add outer '' only if arg included shell metacharacters. */ - if (shell && - (strpbrk(arg, "\r\t\n !\"#$&'()*;<>?[\\]^`{|}~") || !*arg)) { - virBufferAddChar(&buf, '\''); - close_quote = true; - } + if (xml) { - virBufferEscapeString(&buf, "%s", arg); - } else { - if (shell && (q = strchr(arg, '\''))) { - do { - virBufferAdd(&buf, arg, q - arg); - virBufferAddLit(&buf, "'\\''"); - arg = q + 1; - q = strchr(arg, '\''); - } while (q); + virBufferEscapeString(&xmlbuf, "%s", arg); + if (virBufferError(&buf)) { + vshPrint(ctl, "%s", _("Failed to allocate XML buffer")); + return false; } - virBufferAdd(&buf, arg, strlen(arg)); + str = virBufferContentAndReset(&xmlbuf); + } else { + str = vshStrdup(ctl, arg); } - if (close_quote) - virBufferAddChar(&buf, '\''); + + if (shell) + virBufferEscapeShell(&buf, str); + else + virBufferAdd(&buf, str, -1); count++; + VIR_FREE(str); } if (virBufferError(&buf)) { -- 1.7.6.3 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list