[Date Prev][Date Next]
[Chronological]
[Thread]
[Top]
Re: Proper Deinit? ldap_unbind_ext: Assertion `( (ld)->ld_options.ldo_valid == 0x2 )' failed
On Tue, 17 Oct 2006 00:38:46 -0700
Howard Chu <hyc@symas.com> wrote:
> > If the bind fails, the ldap_unbind_ext function asserts:
> >
> > unbind.c:49: ldap_unbind_ext: Assertion `( (ld)->ld_options.ldo_valid == 0x2 )' failed.
> > Aborted
> >
> > What am I doing wrong?
>
> You're confusing your variables, for one thing. You set up ld and then
> try to unbind lx->ld which is obviously something different.
>
> Also you should not progress any further if ldap_initialize fails. Your
> sample there just prints an error message and then keeps on going, using
> an ld variable that is certainly unmodified by ldap_initialize, most
> likely completely uninitialized by you. You should be returning after
> printing that error message...
That's not it. I introduced those errors when I posted the code.
The code asserts if I do simply:
ret = ldap_initialize(&lx->ld, "ldap://foo.example.com");
if (ret == 0)
ldap_unbind_ext(lx->ld, NULL, NULL);
Note that if I hexdump the first 128 bytes of the LDAP pointer I see
the ld_options member which I estimate to be at offset 0x54 is a 0x01:
00000: 60 03 05 0a 02 00 00 00 00 00 00 00 00 00 00 00 |`...............|
00010: 00 00 00 00 02 00 00 00 00 00 00 00 00 00 00 00 |................|
00020: 00 00 00 00 b8 03 05 0a 85 01 00 00 00 00 00 00 |................|
00030: 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 |................|
00040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00050: 01 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 |................|
^
ld_options
00060: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00070: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
which makes sense because it corresponds to LDAP_INITIALIZED (and from
looking at ldap_initizlize this looks like what the value should be):
#define LDAP_INITIALIZED 0x1
#define LDAP_VALID_SESSION 0x2
but the ldap_unbind_ext call checks for 0x2 (LDAP_VALID_SESSION). So
that seems like a possible bug.
However, clearly I don't understand everything going on here because it
does NOT assert if I simply do:
LDAP *ld;
ret = ldap_initialize(&ld, "ldap://foo.example.com");
if (ret == 0)
ldap_unbind_ext(ld, NULL, NULL);
Mike