mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-02-22 19:32:19 +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;
|
virBufferError;
|
||||||
virBufferEscape;
|
virBufferEscape;
|
||||||
virBufferEscapeSexpr;
|
virBufferEscapeSexpr;
|
||||||
|
virBufferEscapeShell;
|
||||||
virBufferEscapeString;
|
virBufferEscapeString;
|
||||||
virBufferFreeAndReset;
|
virBufferFreeAndReset;
|
||||||
virBufferStrcat;
|
virBufferStrcat;
|
||||||
|
@ -485,6 +485,60 @@ virBufferURIEncodeString (virBufferPtr buf, const char *str)
|
|||||||
buf->content[buf->use] = '\0';
|
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:
|
* virBufferStrcat:
|
||||||
* @buf: the buffer to dump
|
* @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 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 virBufferEscape(const virBufferPtr buf, const char *toescape, const char *format, const char *str);
|
||||||
void virBufferURIEncodeString (const virBufferPtr buf, const char *str);
|
void virBufferURIEncodeString (const virBufferPtr buf, const char *str);
|
||||||
|
void virBufferEscapeShell(virBufferPtr buf, const char *str);
|
||||||
|
|
||||||
# define virBufferAddLit(buf_, literal_string_) \
|
# define virBufferAddLit(buf_, literal_string_) \
|
||||||
virBufferAdd (buf_, "" literal_string_ "", sizeof literal_string_ - 1)
|
virBufferAdd (buf_, "" literal_string_ "", sizeof literal_string_ - 1)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user