aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2010-03-15 13:22:06 +0000
committerKeir Fraser <keir.fraser@citrix.com>2010-03-15 13:22:06 +0000
commitaec29abd5bd764a0931e994cdc23a8dacd52196d (patch)
tree96f3278bf8a18ab100f5074d9b0e9a59ad603dc4
parent778143a050d148a56faa3908e0fb003cffdd6a89 (diff)
downloadxen-aec29abd5bd764a0931e994cdc23a8dacd52196d.tar.gz
xen-aec29abd5bd764a0931e994cdc23a8dacd52196d.tar.bz2
xen-aec29abd5bd764a0931e994cdc23a8dacd52196d.zip
libxenlight: fix segfault when domid_to_name returns NULL
The function libxl_domid_to_name() can return NULL if the path /local/domain/%d/name does not exist. This causes a segfault if the NULL name is later passed as a value to libxl_xs_writev(). I'm hitting this making a call to libxl_device_vfb_add() from my graphical switcher application. This patch modifies xs_writev() and libxl_xs_writev() to skip NULL values. Signed-off-by: Eamon Walsh <ewalsh@tycho.nsa.gov>
-rw-r--r--tools/libxl/libxl_xshelp.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/tools/libxl/libxl_xshelp.c b/tools/libxl/libxl_xshelp.c
index 3c065a067b..66de589c36 100644
--- a/tools/libxl/libxl_xshelp.c
+++ b/tools/libxl/libxl_xshelp.c
@@ -33,11 +33,11 @@ int xs_writev(struct xs_handle *xsh, xs_transaction_t t, char *dir, char *kvs[])
for (i = 0; kvs[i] != NULL; i += 2) {
asprintf(&path, "%s/%s", dir, kvs[i]);
- if (path) {
+ if (path && kvs[i + 1]) {
int length = strlen(kvs[i + 1]);
xs_write(xsh, t, path, kvs[i + 1], length);
- free(path);
}
+ free(path);
}
return 0;
}
@@ -74,7 +74,7 @@ int libxl_xs_writev(struct libxl_ctx *ctx, xs_transaction_t t,
for (i = 0; kvs[i] != NULL; i += 2) {
path = libxl_sprintf(ctx, "%s/%s", dir, kvs[i]);
- if (path) {
+ if (path && kvs[i + 1]) {
int length = strlen(kvs[i + 1]);
xs_write(ctx->xsh, t, path, kvs[i + 1], length);
}