[Fedora-directory-commits] ldapserver/ldap/servers/slapd uuid.c, 1.9, 1.10

Richard Allen Megginson (rmeggins) fedora-directory-commits at redhat.com
Sat Oct 13 01:47:17 UTC 2007


Author: rmeggins

Update of /cvs/dirsec/ldapserver/ldap/servers/slapd
In directory cvs-int.fedora.redhat.com:/tmp/cvs-serv28130/ldapserver/ldap/servers/slapd

Modified Files:
	uuid.c 
Log Message:
Resolves: bug 330121
Bug Description: uuid generator truncates clock_seq_hi_and_reserved field
Reviewed by: nkinder (Thanks!)
Fix Description:
The uuid code has this code (where clock_seq is unsigned16 - 2 bytes and
uuid->clock_seq_hi_and_reserved is unsigned8 - 1 byte):
    uuid->clock_seq_hi_and_reserved = (unsigned8)(clock_seq & 0x3F00) >> 8;
In this code, the cast to unsigned8 takes precedence over over the shift.  So
what happens is that (clock_seq & 0x3F00) is first cast to an 8 bit quantity,
then shifted by 8 bits.  The result is that the value is _always 0_.  The code
also does this:
    uuid->clock_seq_hi_and_reserved |= 0x80;

You can see this because every nsUniqueID looks like this:
XXXXXXXX-XXXXXXXX-80XXXXXXXX-XXXXXXXX
The first byte of the 3rd octet is always 80.
This may also be related to https://bugzilla.redhat.com/show_bug.cgi?id=197886 and may explain why the sequence numbers were exhausted so quickly.  Without this fix, we only have 256 sequence numbers available.  This fix adds another 6 bits.
The fix is to mask and shift as an unsigned16 quantity, then cast to unsigned8.
Platforms tested: RHEL5 x86_64
Flag Day: no - I think this will only impact new unique IDs that are generated.  It will not affect existing unique IDs.
Doc impact: no



Index: uuid.c
===================================================================
RCS file: /cvs/dirsec/ldapserver/ldap/servers/slapd/uuid.c,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- uuid.c	24 Sep 2007 22:54:55 -0000	1.9
+++ uuid.c	13 Oct 2007 01:47:15 -0000	1.10
@@ -842,7 +842,7 @@
                                   ((timestamp >> 48) & 0x0FFF);                                                   
     uuid->time_hi_and_version |= (1 << 12);
     uuid->clock_seq_low = clock_seq & 0xFF;
-    uuid->clock_seq_hi_and_reserved = (unsigned8)(clock_seq & 0x3F00) >> 8;
+    uuid->clock_seq_hi_and_reserved = (unsigned8)((clock_seq & 0x3F00) >> 8);
     uuid->clock_seq_hi_and_reserved |= 0x80;
     memcpy(&uuid->node, &_state.genstate.node, sizeof (uuid->node));
 }




More information about the Fedora-directory-commits mailing list