Hi !

Yes, this is 64 bits specific issue.

> According to the documentation, set_h_hash is meant to «specify a
> hashing function». ./examples/func.rb is the only other file to make
> use of this parameter, in exactly the same way as this test (and thus
> will likely fail).

> The most I can dig into the issue right now (as I'm tired and my brain
> does not want to parse C↔Ruby interaction) is that behaviour related
> to set_h_hash is found in lines 666-677 of src/common.h.

The problem is in the hashing function callback;

> static u_int32_t
> #if BDB_OLD_FUNCTION_PROTO
> bdb_h_hash(const void *bytes, u_int32_t length)
> #else
> bdb_h_hash(DB *dbbd, const void *bytes, u_int32_t length)

BDB states that the callback should return a u_int32_t. C code tries to 
convert the ruby number that the returns the (ruby level) hashing function 
into an unsigned int (using the NUM2INT helper), on 64 bits systems this could 
overflow.

> res = rb_funcall(dbst->h_hash, bdb_id_call, 1, st);
> 
> return NUM2INT(res);

I dunno how to procede here. Could simply switch to use NUM2ULONG function to 
evade the overflow but I need to return an u_int32_t due to the callback 
function constrainsts (this could leads to strange behaviour on 64 bits 
system).


--
To UNSUBSCRIBE, email to [email protected]
with a subject of "unsubscribe". Trouble? Contact [email protected]

Reply via email to