On 2024/02/24 20:34:23 +0100, Philipp <phil...@bureaucracy.de> wrote:
> [2024-02-24 12:31] Omar Polo <o...@omarpolo.com>
> > Thanks, I have committed the first two diffs (update ber and aldap, and
> > request only required attributes), but I'm probably missing something in
> > the third diff.
> 
> Thanks.
> 
> > > From 8498921f8e6c106a04c49586f8045867b4902b4f Mon Sep 17 00:00:00 2001
> > > From: Philipp Takacs <phil...@bureaucracy.de>
> > > Date: Sun, 18 Feb 2024 18:55:04 +0100
> > > Subject: [PATCH 3/4] table-ldap handle more then one result
> > > [...]
> > > +static int
> > > +ldap_query(const char *filter, const char *key, char **attributes, 
> > > size_t attrn, struct query_result **results, size_t *nresults)
> > >  {
> > >   struct aldap_message            *m = NULL;
> > >   struct aldap_page_control       *pg = NULL;
> > > - int                              ret, found;
> > > - size_t                           i;
> > > + struct aldap_stringset          *ldap_res;
> > > + struct query_result             *res = NULL;
> > > + int                              ret;
> > > + size_t                           i, j, k, found = 0, nres = 0;
> > >   char                             basedn__[MAX_LDAP_BASELEN];
> > >   char                             filter__[MAX_LDAP_FILTERLEN];
> > >   char                             key__[MAX_LDAP_IDENTIFIER];
> > > @@ -363,12 +381,12 @@ ldap_query(const char *filter, const char *key, 
> > > char **attributes, struct aldap_
> > >           return -1;
> > >   if (strlcpy(key__, key, sizeof key__) >= sizeof key__)
> > >           return -1;
> > > - found = -1;
> > > +
> > >   do {
> > > -         if ((ret = aldap_search(aldap, basedn__, LDAP_SCOPE_SUBTREE,
> > > -             filter__, key__, attributes, 0, 0, 0, pg)) == -1) {
> > > -                 log_debug("ret=%d", ret);
> > > -                 return -1;
> > > +         ret = -1;
> > > +         if (aldap_search(aldap, basedn__, LDAP_SCOPE_SUBTREE,
> > > +             filter__, key__, attributes, 0, 0, 0, pg) == -1) {
> > > +                 goto end;
> > >           }
> > >           if (pg != NULL) {
> > >                   aldap_freepage(pg);
> > > @@ -377,59 +395,60 @@ ldap_query(const char *filter, const char *key, 
> > > char **attributes, struct aldap_
> > >  
> > >           while ((m = aldap_parse(aldap)) != NULL) {
> > >                   if (aldap->msgid != m->msgid)
> > > -                         goto error;
> > > +                         goto end;
> > >                   if (m->message_type == LDAP_RES_SEARCH_RESULT) {
> > >                           if (m->page != NULL && m->page->cookie_len)
> > >                                   pg = m->page;
> > >                           aldap_freemsg(m);
> > >                           m = NULL;
> > > -                         if (found == -1)
> > > -                                 found = 0;
> > > +                         ret = 0;
> >
> > here we set ret to zero and exit the inner loop, but ret will be set to
> > -1 again.  We also optionally set pg to something that's probably
> > non-NULL, so it should loop again.
> >
> > i'm a bit lost.
> 
> Each ldap search return some entries and end with a result. So I set
> ret to 0 after I have sucessfull seen the result. The result optional
> contains a cookie when not all entries are send by the server. The
> client can use this cookie to do another search and get more results.
> Because each search might fail I set ret to -1 before each search.

Yeah, thanks, this is what I understood as well.  What I missed is that
when there's no cookie pg is NULL (it's free'd and set to null before the
inner while), and the outer do-wile loops until pg is set.  So yeah,
this has the chance of actually terminating with ret == 0 :)

Sorry, it took me a while to follow.

Reply via email to