[libvirt] [PATCH] Generate RFC4122 compliant UUIDs

Daniel P. Berrange berrange at redhat.com
Mon Apr 8 16:45:23 UTC 2013


On Mon, Apr 08, 2013 at 12:35:40PM -0400, Milos Vyletel wrote:
> 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;
>  }

ACK to this bit of the patch

>  
> @@ -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++)

but NACk to this part

What you're checking here is just one possible valid scheme for UUIDs.
We shouldn't reject UUIDs just because they use a different scheme than
the one we do.

Regards,
Daniel
-- 
|: http://berrange.com      -o-    http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org              -o-             http://virt-manager.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org       -o-       http://live.gnome.org/gtk-vnc :|




More information about the libvir-list mailing list