[libvirt] [PATCH] Generate RFC4122 compliant UUIDs

Milos Vyletel milos.vyletel at sde.cz
Mon Apr 8 16:35:40 UTC 2013


Even though http://libvirt.org/formatdomain.html#elementsMetadata
states that it requires RFC4122 compliance UUIDs that are generated
by virUUIDGenerate() are not. Neither does virUUIDIsValid() check
for RFC4122 compliance. Following patch modifies virUUIDGenerate()
to generate valid UUIDs and adds check to virUUIDIsValid() to validate
UUIDs.

Signed-off-by: Milos Vyletel <milos.vyletel at sde.cz>
---
 src/util/viruuid.c |   31 +++++++++++++++++++++++++++++++
 1 files changed, 31 insertions(+), 0 deletions(-)

diff --git a/src/util/viruuid.c b/src/util/viruuid.c
index 7250543..2dc9a56 100644
--- a/src/util/viruuid.c
+++ b/src/util/viruuid.c
@@ -114,6 +114,25 @@ virUUIDGenerate(unsigned char *uuid)
         err = virUUIDGeneratePseudoRandomBytes(uuid, VIR_UUID_BUFLEN);
     }
 
+    /*
+     * Make UUID RFC 4122 compliant. Following form will be used:
+     *
+     * xxxxxxxx-xxxx-Axxx-Bxxx-xxxxxxxxxxxx
+     *
+     * where
+     * A is version defined in 4.1.3 of RFC
+     *  Msb0  Msb1  Msb2  Msb3   Version  Description
+     *   0     1     0     0        4     The randomly or pseudo-
+     *                                    randomly generated version
+     *                                    specified in this document.
+     *
+     * B is variant defined in 4.1.1 of RFC
+     *  Msb0  Msb1  Msb2  Description
+     *   1     0     x    The variant specified in this document.
+     */
+    uuid[6] = (uuid[6] & 0x0F) | (4 << 4);
+    uuid[8] = (uuid[8] & 0x3F) | (2 << 6);
+
     return err;
 }
 
@@ -209,6 +228,7 @@ virUUIDFormat(const unsigned char *uuid, char *uuidstr)
  * Do some basic tests to check whether the given UUID is
  * valid as a host UUID.
  * Basic tests:
+ *  - Validate RFC4122 compliance
  *  - Not all of the digits may be equal
  */
 int
@@ -216,10 +236,21 @@ virUUIDIsValid(unsigned char *uuid)
 {
     unsigned int i, ctr = 1;
     unsigned char c;
+    unsigned char version;
+    unsigned char variant;
 
     if (!uuid)
         return 0;
 
+    /*
+     * RFC4122 defines version 1 to 5 (section 4.1.3)
+     * RFC4122 defined variant is desribed in section 4.1.1
+     */
+    version = (uuid[6] >> 4);
+    variant = (uuid[8] >> 6);
+    if (!(version > 0 && version <= 5) || variant != 2)
+        return 0;
+
     c = uuid[0];
 
     for (i = 1; i < VIR_UUID_BUFLEN; i++)
-- 
1.7.1




More information about the libvir-list mailing list