[libvirt] [PATCH 1/2] Add virBufferQuoteString

Eric Blake eblake at redhat.com
Mon Aug 1 20:28:59 UTC 2011


On 07/29/2011 03:12 AM, Guido Günther wrote:
> Quote strings so they're safe to pass to the shell. Based on glib's
> g_quote_string.
> ---
>   src/libvirt_private.syms |    1 +
>   src/util/buf.c           |   29 +++++++++++++++++++++++++++++
>   src/util/buf.h           |    1 +
>   3 files changed, 31 insertions(+), 0 deletions(-)
>
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index 853ee62..eb16fb6 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -28,6 +28,7 @@ virBufferError;
>   virBufferEscapeSexpr;
>   virBufferEscapeString;
>   virBufferFreeAndReset;
> +virBufferQuoteString;

I'd prefer that we had the term Shell somewhere in the name, and perhaps 
keep it similar to other escaping functions.  How about:

virBufferEscapeShell;

Also, virsh.c could use this new function in its implementation of 
'virsh echo --shell'.

>   /**
> + * virBufferQuoteString:
> + * @buf:  the buffer to append to
> + * @str:  an unquoted string
> + *
> + * Quotes a string so that the shell (/bin/sh) will interpret the
> + * quoted string as unquoted_string.
> + */
> +void
> +virBufferQuoteString(const virBufferPtr buf, const char *unquoted_str)
> +{
> +    const char *p;
> +
> +    virBufferAddChar(buf, '\'');
> +    p = unquoted_str;

I'd _really_ like to make this smart enough to omit outer '' if the 
entire string does not need quoting (again, see how virsh cmdEcho does it).

> +
> +    while (*p) {
> +        /* Replace literal ' with a close ', a \', and a open ' */
> +        if (*p == '\'')
> +            virBufferAddLit(buf, "'\\''");
> +        else
> +            virBufferAddChar(buf, *p);

That's a bit slow compared to the other virBufferEscape* methods which 
pre-allocate based on worst case, then do things directly into the 
output buffer rather than making a function call for every byte.

Overall, the idea is nice, and I also imagine using it in 
virCommandToString to output unambiguous log messages for commands about 
to be run, but it's not quite ready yet.

I'm torn on whether to touch this up and include it in 0.9.4 (since it 
is turning into a frequently reported issue), or defer it to 
post-release since it is starting to grow in scope.

-- 
Eric Blake   eblake at redhat.com    +1-801-349-2682
Libvirt virtualization library http://libvirt.org




More information about the libvir-list mailing list