Fix ldap lookup for single-attr request, multiple-attr return. Bug 1521
authorHeiko Schlittermann <hs+exim@schlittermann.de>
Thu, 11 Sep 2014 21:25:51 +0000 (22:25 +0100)
committerJeremy Harris <jgh146exb@wizmail.org>
Thu, 11 Sep 2014 21:40:50 +0000 (22:40 +0100)
Exim documented behaviour is that the single-request case controls
the output format (by not labelling attributes with names).
The code is broken for the case where attrs B, C are derived from A
and A is requested (and the LDAP server used isn't buggy here; some
are and only return A rather than A, B, C).

src/src/lookups/ldap.c

index f77229ded320ba5b6923f7f916d7d26ee0c0cc89..ef7ed9e340040842fb4894d14953edec85bf01c7 100644 (file)
@@ -797,7 +797,13 @@ while ((rc = ldap_result(lcp->ld, msgid, 0, timeoutptr, &result)) ==
 
             DEBUG(D_lookup) debug_printf("LDAP attr loop %s:%s\n", attr, value);
 
 
             DEBUG(D_lookup) debug_printf("LDAP attr loop %s:%s\n", attr, value);
 
-            if (values != firstval)
+           /* In case we requested one attribute only but got
+            * several times into that attr loop, we need to append
+            * the additional values. (This may happen if you derive 
+            * attributeTypes B and C from A and then query for A.)
+            * In all other cases we detect the different attribute
+            * and append only every non first value. */
+           if ((attr_count == 1 && data) || (values != firstval))
               data = string_cat(data, &size, &ptr, US",", 1);
 
             /* For multiple attributes, the data is in quotes. We must escape
               data = string_cat(data, &size, &ptr, US",", 1);
 
             /* For multiple attributes, the data is in quotes. We must escape