]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
* src/xml.c: fix virParseUUID()
authorDaniel Veillard <veillard@redhat.com>
Thu, 17 Aug 2006 18:39:32 +0000 (18:39 +0000)
committerDaniel Veillard <veillard@redhat.com>
Thu, 17 Aug 2006 18:39:32 +0000 (18:39 +0000)
Daniel

ChangeLog
src/xml.c

index b359a6bb9a482a988ad0506c8211469de4be2750..a0e4e1c21b8a4683d30586812b6adf6335464e1f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+Thu Aug 17 19:42:50 CEST 2006 Daniel Veillard <veillard@redhat.com>
+
+       * src/xml.c: fix virParseUUID() 
+
 Wed Aug 16 19:07:52 CEST 2006 Daniel Veillard <veillard@redhat.com>
 
        * NEWS configure.in doc//* include/libvirt/libvirt.h 
index 145975227eb87fa9f06eaf8997e3c4e074b3f5ee..e1fcf7a8f6cb029fe633e206e5d3580e72709d0e 100644 (file)
--- a/src/xml.c
+++ b/src/xml.c
@@ -1254,59 +1254,56 @@ virDomainParseXMLDesc(const char *xmldesc, char **name)
 
 unsigned char *virParseUUID(char **ptr, const char *uuid) {
     int rawuuid[16];
+    const char *cur;
     unsigned char *dst_uuid = NULL;
-    int ret;
     int i;
 
-    memset(rawuuid, 0xFF, sizeof(rawuuid));
-
     if (uuid == NULL)
         goto error;
 
-    ret = sscanf(uuid,
-                 "%02x%02x%02x%02x"
-                 "%02x%02x%02x%02x"
-                 "%02x%02x%02x%02x"
-                 "%02x%02x%02x%02x",
-                 rawuuid + 0, rawuuid + 1, rawuuid + 2, rawuuid + 3,
-                 rawuuid + 4, rawuuid + 5, rawuuid + 6, rawuuid + 7,
-                 rawuuid + 8, rawuuid + 9, rawuuid + 10, rawuuid + 11,
-                 rawuuid + 12, rawuuid + 13, rawuuid + 14, rawuuid + 15);
-    if (ret == 16)
-        goto done;
-
-    ret = sscanf(uuid,
-                 "%02x%02x%02x%02x-"
-                 "%02x%02x-"
-                 "%02x%02x-"
-                 "%02x%02x-"
-                 "%02x%02x%02x%02x%02x%02x",
-                 rawuuid + 0, rawuuid + 1, rawuuid + 2, rawuuid + 3,
-                 rawuuid + 4, rawuuid + 5, rawuuid + 6, rawuuid + 7,
-                 rawuuid + 8, rawuuid + 9, rawuuid + 10, rawuuid + 11,
-                 rawuuid + 12, rawuuid + 13, rawuuid + 14, rawuuid + 15);
-    if (ret == 16)
-        goto done;
-
-    ret = sscanf(uuid,
-                 "%02x%02x%02x%02x-"
-                 "%02x%02x%02x%02x-"
-                 "%02x%02x%02x%02x-"
-                 "%02x%02x%02x%02x",
-                 rawuuid + 0, rawuuid + 1, rawuuid + 2, rawuuid + 3,
-                 rawuuid + 4, rawuuid + 5, rawuuid + 6, rawuuid + 7,
-                 rawuuid + 8, rawuuid + 9, rawuuid + 10, rawuuid + 11,
-                 rawuuid + 12, rawuuid + 13, rawuuid + 14, rawuuid + 15);
-    if (ret != 16)
-        goto error;
+    /*
+     * do a liberal scan allowing '-' and ' ' anywhere between character
+     * pairs as long as there is 32 of them in the end.
+     */
+    cur = uuid;
+    for (i = 0;i < 16;) {
+        rawuuid[i] = 0;
+        if (*cur == 0)
+           goto error;
+       if ((*cur == '-') || (*cur == ' ')) {
+           cur++;
+           continue;
+       }
+       if ((*cur >= '0') && (*cur <= '9'))
+           rawuuid[i] = *cur - '0';
+       else if ((*cur >= 'a') && (*cur <= 'f'))
+           rawuuid[i] = *cur - 'a' + 10;
+       else if ((*cur >= 'A') && (*cur <= 'F'))
+           rawuuid[i] = *cur - 'A' + 10;
+       else
+           goto error;
+       rawuuid[i] *= 16;
+       cur++;
+        if (*cur == 0)
+           goto error;
+       if ((*cur >= '0') && (*cur <= '9'))
+           rawuuid[i] += *cur - '0';
+       else if ((*cur >= 'a') && (*cur <= 'f'))
+           rawuuid[i] += *cur - 'a' + 10;
+       else if ((*cur >= 'A') && (*cur <= 'F'))
+           rawuuid[i] += *cur - 'A' + 10;
+       else
+           goto error;
+        i++;
+       cur++;
+    }
 
-  done:
     dst_uuid = (unsigned char *) *ptr;
     *ptr += 16;
 
     for (i = 0; i < 16; i++)
         dst_uuid[i] = rawuuid[i] & 0xFF;
 
-  error:
-    return dst_uuid;
+error:
+    return(dst_uuid);
 }