diff options
author | Keir Fraser <keir.fraser@citrix.com> | 2010-03-15 13:22:06 +0000 |
---|---|---|
committer | Keir Fraser <keir.fraser@citrix.com> | 2010-03-15 13:22:06 +0000 |
commit | aec29abd5bd764a0931e994cdc23a8dacd52196d (patch) | |
tree | 96f3278bf8a18ab100f5074d9b0e9a59ad603dc4 | |
parent | 778143a050d148a56faa3908e0fb003cffdd6a89 (diff) | |
download | xen-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.c | 6 |
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); } |