mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-02-22 03:12:22 +00:00
Add virBufferEscapeShell
Escape strings so they're safe to pass to the shell. It's based on virsh's cmdEcho.
This commit is contained in:
parent
a2b5c57db8
commit
920487b36d
@ -27,6 +27,7 @@ virBufferContentAndReset;
|
||||
virBufferError;
|
||||
virBufferEscape;
|
||||
virBufferEscapeSexpr;
|
||||
virBufferEscapeShell;
|
||||
virBufferEscapeString;
|
||||
virBufferFreeAndReset;
|
||||
virBufferStrcat;
|
||||
|
@ -485,6 +485,60 @@ virBufferURIEncodeString (virBufferPtr buf, const char *str)
|
||||
buf->content[buf->use] = '\0';
|
||||
}
|
||||
|
||||
/**
|
||||
* virBufferEscapeShell:
|
||||
* @buf: the buffer to append to
|
||||
* @str: an unquoted string
|
||||
*
|
||||
* Quotes a string so that the shell (/bin/sh) will interpret the
|
||||
* quoted string to mean str.
|
||||
*/
|
||||
void
|
||||
virBufferEscapeShell(virBufferPtr buf, const char *str)
|
||||
{
|
||||
int len;
|
||||
char *escaped, *out;
|
||||
const char *cur;
|
||||
|
||||
if ((buf == NULL) || (str == NULL))
|
||||
return;
|
||||
|
||||
if (buf->error)
|
||||
return;
|
||||
|
||||
/* Only quote if str includes shell metacharacters. */
|
||||
if (!strpbrk(str, "\r\t\n !\"#$&'()*;<>?[\\]^`{|}~")) {
|
||||
virBufferAdd(buf, str, -1);
|
||||
return;
|
||||
}
|
||||
|
||||
len = strlen(str);
|
||||
if (xalloc_oversized(4, len) ||
|
||||
VIR_ALLOC_N(escaped, 4 * len + 3) < 0) {
|
||||
virBufferSetError(buf);
|
||||
return;
|
||||
}
|
||||
|
||||
cur = str;
|
||||
out = escaped;
|
||||
|
||||
*out++ = '\'';
|
||||
while (*cur != 0) {
|
||||
*out++ = *cur++;
|
||||
if (*cur == '\'') {
|
||||
/* Replace literal ' with a close ', a \', and a open ' */
|
||||
*out++ = '\\';
|
||||
*out++ = '\'';
|
||||
*out++ = '\'';
|
||||
}
|
||||
}
|
||||
*out++ = '\'';
|
||||
*out = 0;
|
||||
|
||||
virBufferAdd(buf, escaped, -1);
|
||||
VIR_FREE(escaped);
|
||||
}
|
||||
|
||||
/**
|
||||
* virBufferStrcat:
|
||||
* @buf: the buffer to dump
|
||||
|
@ -52,6 +52,7 @@ void virBufferEscapeString(const virBufferPtr buf, const char *format, const cha
|
||||
void virBufferEscapeSexpr(const virBufferPtr buf, const char *format, const char *str);
|
||||
void virBufferEscape(const virBufferPtr buf, const char *toescape, const char *format, const char *str);
|
||||
void virBufferURIEncodeString (const virBufferPtr buf, const char *str);
|
||||
void virBufferEscapeShell(virBufferPtr buf, const char *str);
|
||||
|
||||
# define virBufferAddLit(buf_, literal_string_) \
|
||||
virBufferAdd (buf_, "" literal_string_ "", sizeof literal_string_ - 1)
|
||||
|
Loading…
x
Reference in New Issue
Block a user