提交 b14e7d2a 编写于 作者: P Philipp Hahn 提交者: Daniel Veillard

Fix URL-escaping for domainDefine

'+' in strings get translated to ' ' when editing domains.
While xenDaemonDomainCreateXML() did URL-escape the sexpr,
xenDaemonDomainDefineXML() did not.

Remove the explicit urlencode() in xenDaemonDomainCreateXML() and add
the direct encoding calls to xend_op_ext() because it calls xend_post()
which uses "Content-Type: application/x-www-form-urlencoded". According
to <http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4.1> this
requires all parameters to be url-encoded as specified in rfc1738.

Notice: virBufferAsprintf(..., "%s=%s", ...) is again replaced by three
calls to virBufferURIEncodeString() and virBufferAddChar() because '='
is a "reserved" character, which would get escaped by
virBufferURIEncodeString(), which - by the way - escapes anything not
c_isalnum().
Signed-off-by: NPhilipp Hahn <hahn@univention.de>
上级 498d7833
......@@ -487,7 +487,9 @@ xend_op_ext(virConnectPtr xend, const char *path, const char *key, va_list ap)
while (k) {
v = va_arg(ap, const char *);
virBufferAsprintf(&buf, "%s=%s", k, v);
virBufferURIEncodeString(&buf, k);
virBufferAddChar(&buf, '=');
virBufferURIEncodeString(&buf, v);
k = va_arg(ap, const char *);
if (k)
......@@ -599,47 +601,6 @@ sexpr_uuid(unsigned char *ptr, const struct sexpr *node, const char *path)
return virUUIDParse(r, ptr);
}
/**
* urlencode:
* @string: the input URL
*
* Encode an URL see RFC 2396 and following
*
* Returns the new string or NULL in case of error.
*/
static char *
urlencode(const char *string)
{
size_t len = strlen(string);
char *buffer;
char *ptr;
size_t i;
if (VIR_ALLOC_N(buffer, len * 3 + 1) < 0) {
virReportOOMError();
return (NULL);
}
ptr = buffer;
for (i = 0; i < len; i++) {
switch (string[i]) {
case ' ':
case '\n':
case '&':
snprintf(ptr, 4, "%%%02x", string[i]);
ptr += 3;
break;
default:
*ptr = string[i];
ptr++;
}
}
*ptr = 0;
return buffer;
}
/* PUBLIC FUNCTIONS */
/**
......@@ -862,22 +823,9 @@ xenDaemonListDomainsOld(virConnectPtr xend)
int
xenDaemonDomainCreateXML(virConnectPtr xend, const char *sexpr)
{
int ret, serrno;
char *ptr;
ptr = urlencode(sexpr);
if (ptr == NULL) {
/* this should be caught at the interface but ... */
virXendError(VIR_ERR_INTERNAL_ERROR,
"%s", _("failed to urlencode the create S-Expr"));
return (-1);
}
ret = xend_op(xend, "", "op", "create", "config", ptr, NULL);
int ret;
serrno = errno;
VIR_FREE(ptr);
errno = serrno;
ret = xend_op(xend, "", "op", "create", "config", sexpr, NULL);
return ret;
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册