[Date Prev][Date Next]
[Chronological]
[Thread]
[Top]
Re: (ITS#76)
This was meant to be followup to ITS#76. Due to extra space after the
# sign, the system failed to recognize it as such.
Regrettably, -bug readers will have to put up with forwarding.
Kurt
At 10:05 PM 2/18/99 GMT, dirk-n@dircon.co.uk wrote:
>I have found out more about the coredump-
>I can reproduce it using 'ldapsearch' using the following command line
>(with my ldif file)
>
>ldapsearch -v -D
>'cn=WWW/LDAP-Gateway,cn=fornax,ou=IT,ou=Admin,ou=Periphonics VPS
>Ltd.,c=GB,ou=Periphonics EMEA,o=Periphonics Corporation,dc=peri,dc=com'
>-b 'c=GB,ou=Periphonics EMEA,o=Periphonics Corporation,dc=peri,dc=com'
>-s base -a find 'objectclass=*'
>
>It's caused when:
>a) base DN is set to a value like
>'ou=MyOrgU,ou=MyHigherOrgU,o=MyOrg,c=GB'
>b) we are beginning a search with filter 'objectclass=*'
>c) the DN we begin the search with is something like
>'ou=MyHigherOrgU,o=MyOrg,c=GB'
> (so it's above the base. does this even make sense)
>d) There is no DN entry in the database for
>'ou=MyHigherOrgU,o=MyOrg,c=GB'
> but there is one for 'o=MyOrg,c=GB'
>e) alias deref is set to always or search. i.e we have to try aliases on
>this.
>
>There is a problem in derefDN in back-ldbm/alias.c where it is possible
>that we break out of the first large alias search loop with newDN set to
>NULL.
>The second loop (which checks to see if there are any aliases left in
>the remaining part of the DN, I guess) could call dn2entry_r with a NULL
>DN. That's what causes the segfault..
>
>I've got a fix that will stop the coredump, but I think it might break
>the alias mechanism in more general ways. Basically consists of an
>if(NewDN != NULL) wrapper around the second alias search loop. If newDN
>is set to null the derefDN routine then just returns the old DN. I have
>no idea whether that behaviour is correct.
>
>here is a diff (I don't think it actually fixes behaviour, it just
>prevents
>the coredump.
>----------------------------------- cut here
>-----------------------------------
>--- alias.c.orig Thu Feb 4 18:49:52 1999
>+++ alias.c Thu Feb 18 21:29:48 1999
>@@ -278,15 +278,17 @@
> * e.g. if we had started with dn = o=MyAliasedOrg,c=MyCountry the dn
>would match
> * and the above loop complete but we would still be left with an
>aliased DN.
> */
>- if ( (eNew = dn2entry_r( be, newDN, &matched )) != NULL) {
>- if ((eDeref = derefAlias_r( be, conn, op, eNew )) != NULL) {
>- free (newDN);
>- newDN = ch_strdup (eDeref->e_dn);
>+ if (newDN != NULL) {
>+ if ( (eNew = dn2entry_r( be, newDN, &matched )) != NULL) {
>+ if ((eDeref = derefAlias_r( be, conn, op, eNew )) != NULL) {
>+ free (newDN);
>+ newDN = ch_strdup (eDeref->e_dn);
>+ /* free reader lock */
>+ cache_return_entry_r(&li->li_cache, eDeref);
>+ }
> /* free reader lock */
>- cache_return_entry_r(&li->li_cache, eDeref);
>+ cache_return_entry_r(&li->li_cache, eNew);
> }
>- /* free reader lock */
>- cache_return_entry_r(&li->li_cache, eNew);
> }
> if (matched != NULL) free(matched);
>
>------------------------------ cut here -------------------------------
> | / _ \ _ _| __ \ Dirk Niggemann
> ' / | | | | | dirk-n@dircon.co.uk
> . \ __ < | | |
>_|\_\_| \_\___|____/
>
>