diff --git a/ChangeLog b/ChangeLog index b359a6bb9a..a0e4e1c21b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +Thu Aug 17 19:42:50 CEST 2006 Daniel Veillard + + * src/xml.c: fix virParseUUID() + Wed Aug 16 19:07:52 CEST 2006 Daniel Veillard * NEWS configure.in doc//* include/libvirt/libvirt.h diff --git a/src/xml.c b/src/xml.c index 145975227e..e1fcf7a8f6 100644 --- 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; + /* + * 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++; + } - 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; - - 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); }