From: Roger Pau Monne <roger.pau@citrix.com>
To: xen-devel@lists.xenproject.org
Cc: Roger Pau Monne <roger.pau@citrix.com>
Subject: [PATCH 2/2] libxl: fix UUID usage on FreeBSD
Date: Tue, 12 Jan 2016 14:14:27 +0100 [thread overview]
Message-ID: <1452604467-65746-3-git-send-email-roger.pau@citrix.com> (raw)
In-Reply-To: <1452604467-65746-1-git-send-email-roger.pau@citrix.com>
libxl makes the assumtion that libxl_uuid == uuid_t, and that uuid_t can be
freely used as a byte array. This is not true on FreeBSD (and NetBSD
too, not sure about other BSD UUID implementations), where the internals of
uuid don't match what libxl expects as a byte array because of endianness
issues.
Fix this by converting the libxl_uuid type to a struct with an internal
uuid_t field and a byte-array. Also introduce a new function that should be
used in order to load a byte array into a uuid_t struct.
Signed-off-by: Roger Pau Monné <roger.pau@citrix.com>
---
tools/libxl/libxl.c | 2 +-
tools/libxl/libxl.h | 9 +++++++++
tools/libxl/libxl_uuid.c | 22 +++++++++++++++++++---
tools/libxl/libxl_uuid.h | 3 ++-
4 files changed, 31 insertions(+), 5 deletions(-)
diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c
index 9207621..ae08b2f 100644
--- a/tools/libxl/libxl.c
+++ b/tools/libxl/libxl.c
@@ -616,7 +616,7 @@ static void xcinfo2xlinfo(libxl_ctx *ctx,
{
size_t size;
- memcpy(&(xlinfo->uuid), xcinfo->handle, sizeof(xen_domain_handle_t));
+ libxl_uuid_from_bytearray(&xlinfo->uuid, xcinfo->handle);
xlinfo->domid = xcinfo->domain;
xlinfo->ssidref = xcinfo->ssidref;
if (libxl_flask_sid_to_context(ctx, xlinfo->ssidref,
diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h
index 05606a7..876fca8 100644
--- a/tools/libxl/libxl.h
+++ b/tools/libxl/libxl.h
@@ -867,6 +867,15 @@ void libxl_mac_copy(libxl_ctx *ctx, libxl_mac *dst, libxl_mac *src);
*/
#define LIBXL_HAVE_DEVICE_MODEL_VERSION_NONE 1
+/*
+ * LIBXL_HAVE_UUID_FROM_BYTEARRAY
+ *
+ * In the case that LIBXL_HAVE_UUID_FROM_BYTEARRAY is set libxl
+ * provides a function (libxl_uuid_from_bytearray) to convert an
+ * octet stream into a UUID.
+ */
+#define LIBXL_HAVE_UUID_FROM_BYTEARRAY 1
+
typedef char **libxl_string_list;
void libxl_string_list_dispose(libxl_string_list *sl);
int libxl_string_list_length(const libxl_string_list *sl);
diff --git a/tools/libxl/libxl_uuid.c b/tools/libxl/libxl_uuid.c
index 7d4a032..f566f50 100644
--- a/tools/libxl/libxl_uuid.c
+++ b/tools/libxl/libxl_uuid.c
@@ -33,6 +33,12 @@ int libxl_uuid_from_string(libxl_uuid *uuid, const char *in)
return uuid_parse(in, uuid->uuid);
}
+int libxl_uuid_from_bytearray(libxl_uuid *uuid, const uint8_t *raw)
+{
+ memcpy(uuid, raw, sizeof(*uuid));
+ return 0;
+}
+
void libxl_uuid_copy(libxl_ctx *ctx_opt, libxl_uuid *dst,
const libxl_uuid *src)
{
@@ -72,9 +78,9 @@ void libxl_uuid_generate(libxl_uuid *uuid)
{
uint32_t status;
- BUILD_BUG_ON(sizeof(libxl_uuid) != sizeof(uuid_t));
uuid_create(&uuid->uuid, &status);
assert(status == uuid_s_ok);
+ uuid_enc_be(uuid->uuid_raw, &uuid->uuid);
}
#ifdef __FreeBSD__
@@ -85,6 +91,8 @@ int libxl_uuid_from_string(libxl_uuid *uuid, const char *in)
uuid_from_string(in, &uuid->uuid, &status);
if (status != uuid_s_ok)
return -1;
+ uuid_enc_be(uuid->uuid_raw, &uuid->uuid);
+
return 0;
}
#else
@@ -101,15 +109,23 @@ int libxl_uuid_from_string(libxl_uuid *uuid, const char *in)
#undef LIBXL__UUID_PTRS
#endif
+int libxl_uuid_from_bytearray(libxl_uuid *uuid, const uint8_t *raw)
+{
+ uuid_dec_le(raw, &uuid->uuid);
+ uuid_enc_be(uuid->uuid_raw, &uuid->uuid);
+
+ return 0;
+}
+
void libxl_uuid_copy(libxl_ctx *ctx_opt, libxl_uuid *dst,
const libxl_uuid *src)
{
- memcpy(&dst->uuid, &src->uuid, sizeof(dst->uuid));
+ memcpy(dst, src, sizeof(*dst));
}
void libxl_uuid_clear(libxl_uuid *uuid)
{
- memset(&uuid->uuid, 0, sizeof(uuid->uuid));
+ memset(uuid, 0, sizeof(*uuid));
}
#ifdef __FreeBSD__
diff --git a/tools/libxl/libxl_uuid.h b/tools/libxl/libxl_uuid.h
index c5041c7..d84e3d1 100644
--- a/tools/libxl/libxl_uuid.h
+++ b/tools/libxl/libxl_uuid.h
@@ -42,7 +42,7 @@ typedef struct {
#include <stdio.h>
#include <assert.h>
-typedef union {
+typedef struct {
uuid_t uuid;
uint8_t uuid_raw[16];
} libxl_uuid;
@@ -73,6 +73,7 @@ void libxl_uuid_clear(libxl_uuid *uuid);
int libxl_uuid_compare(const libxl_uuid *uuid1, const libxl_uuid *uuid2);
const uint8_t *libxl_uuid_bytearray_const(const libxl_uuid *uuid);
uint8_t *libxl_uuid_bytearray(libxl_uuid *uuid);
+int libxl_uuid_from_bytearray(libxl_uuid *uuid, const uint8_t *raw);
#endif /* __LIBXL_UUID_H__ */
--
1.9.5 (Apple Git-50.3)
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel
next prev parent reply other threads:[~2016-01-12 13:14 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-01-12 13:14 [PATCH 0/2] libxl: FreeBSD fixes Roger Pau Monne
2016-01-12 13:14 ` [PATCH 1/2] libxl: fix _SC_GETPW_R_SIZE_MAX usage Roger Pau Monne
2016-01-13 3:19 ` Doug Goldstein
2016-01-13 9:08 ` Roger Pau Monné
2016-01-15 10:16 ` Ian Campbell
2016-01-12 13:14 ` Roger Pau Monne [this message]
2016-01-15 10:26 ` [PATCH 2/2] libxl: fix UUID usage on FreeBSD Ian Campbell
2016-01-15 15:11 ` Roger Pau Monné
2016-01-15 15:26 ` Ian Campbell
2016-01-19 18:40 ` Ian Jackson
2016-01-12 14:54 ` [PATCH 0/2] libxl: FreeBSD fixes Roger Pau Monné
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1452604467-65746-3-git-send-email-roger.pau@citrix.com \
--to=roger.pau@citrix.com \
--cc=xen-devel@lists.xenproject.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).