[Freeipa-devel] [PATCH 79] Ticket #3008: DN objects hash differently depending on case

Alexander Bokovoy abokovoy at redhat.com
Mon Aug 20 11:30:20 UTC 2012


On Fri, 17 Aug 2012, John Dennis wrote:
>Because the attrs & values in DN's, RDN's and AVA's are comparison case-
>insensitive the hash value between two objects which compare as equal but
>differ in case must also yield the same hash value. This is critical when
>these objects are used as a dict key or in a set because dicts and sets
>use the object's __hash__ value in conjunction with the objects __eq__
>method to lookup the object.
>
>The defect is the DN, RDN & AVA objects computed their hash from the case-
>preserving string representation thus two otherwise equal objects
>incorrectly yielded different hash values.
>
>The problem manifests itself when one of these objects is used as a key in
>a dict, for example a dn.
>
>dn1 = DN(('cn', 'Bob'))
>dn2 = DN(('cn', 'bob'))
>
>dn1 == dn2 --> True
>
>hash(dn1) == hash(dn2) --> False
>
>d = {}
>
>d[dn1] = x
>d[dn2] = y
>
>len(d) --> 2
>
>The patch fixes the above by lower casing the string representation of
>the object prior to computing it's hash.
>
>The patch also corrects a spelling mistake and a bogus return value in
>ldapupdate.py which happened to be discovered while researching this
>bug.
ACK.

With this patch I am no longer getting constraint violation errors.

-- 
/ Alexander Bokovoy




More information about the Freeipa-devel mailing list