Bug 330121 - uuid generator truncates clock_seq_hi_and_reserved field
Summary: uuid generator truncates clock_seq_hi_and_reserved field
Keywords:
Status: CLOSED CURRENTRELEASE
Alias: None
Product: 389
Classification: Retired
Component: Directory Server
Version: 1.1.0beta
Hardware: All
OS: All
high
high
Target Milestone: ---
Assignee: Rich Megginson
QA Contact: Viktor Ashirov
URL:
Whiteboard:
Depends On:
Blocks: 240316 FDS1.1.0
TreeView+ depends on / blocked
 
Reported: 2007-10-12 21:37 UTC by Rich Megginson
Modified: 2015-12-07 16:36 UTC (History)
0 users

Fixed In Version:
Doc Type: Bug Fix
Doc Text:
Clone Of:
Environment:
Last Closed: 2015-12-07 16:36:00 UTC
Embargoed:


Attachments (Terms of Use)
diffs (1.33 KB, patch)
2007-10-12 21:37 UTC, Rich Megginson
no flags Details | Diff
cvs commit log (162 bytes, text/plain)
2007-10-13 01:48 UTC, Rich Megginson
no flags Details

Description Rich Megginson 2007-10-12 21:37:24 UTC
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.

Comment 1 Rich Megginson 2007-10-12 21:37:24 UTC
Created attachment 226161 [details]
diffs

Comment 2 Nathan Kinder 2007-10-12 23:24:35 UTC
Good catch!

Comment 3 Rich Megginson 2007-10-13 01:48:01 UTC
Created attachment 226261 [details]
cvs commit log

Reviewed by: nkinder (Thanks!)
Files: see diff
Branch: HEAD
Fix Description: https://bugzilla.redhat.com/show_bug.cgi?id=330121#c0
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


Note You need to log in before you can comment on or make changes to this bug.