Ah, I forgot, I still have this in my workspace.  it simplifies
ldap_parse_attributes() a bit.  can you add it to your testing? :)

thanks!

diff 020c2633322f5ac881ca10a922493f81b7516542 
53029173a8d77cba5fb3a66a29d1d83212948e3c
commit - 020c2633322f5ac881ca10a922493f81b7516542
commit + 53029173a8d77cba5fb3a66a29d1d83212948e3c
blob - fcef111d623f5f5336a0da99de60c029ebbed1bc
blob + fc78db40faf62fba8f33817bb81381fcbd88480a
--- table_ldap.c
+++ table_ldap.c
@@ -358,42 +358,42 @@ read_value(char **store, const char *key, const char *
 }
 
 static int
-ldap_parse_attributes(struct query *query, const char *key, const char *line,
-    size_t expect)
+ldap_parse_attributes(struct query *query, const char *key, char *line,
+    size_t expected)
 {
-       char    buffer[1024];
-       char   *p;
-       size_t  m, n;
+       char    *item;
+       size_t   i;
 
-       log_debug("debug: parsing attribute \"%s\" (%zu) -> \"%s\"", key,
-           expect, line);
-
-       if (strlcpy(buffer, line, sizeof buffer) >= sizeof buffer)
+       if (query->attrn != 0) {
+               log_warnx("%s already set", key);
                return 0;
-
-       m = 1;
-       for (p = buffer; *p; ++p) {
-               if (*p == ',') {
-                       *p = 0;
-                       m++;
-               }
        }
-       if (expect != m)
-               return 0;
 
-       p = buffer;
-       for (n = 0; n < expect; ++n)
-               query->attrs[n] = NULL;
-       for (n = 0; n < m; ++n) {
-               query->attrs[n] = strdup(p);
-               if (query->attrs[n] == NULL) {
+       for (i = 0; i < expected; ++i)
+               query->attrs[i] = NULL;
+
+       for (i = 0; (item = strsep(&line, ",")) != NULL; i++) {
+               if (i >= expected)
+                       break;
+
+               item = strip(item);
+               if ((query->attrs[i] = strdup(item)) == NULL) {
                        log_warnx("warn: strdup");
-                       return 0; /* XXX cleanup */
+                       break;
                }
-               p += strlen(p) + 1;
                query->attrn++;
        }
-       return 1;
+
+       if (item == NULL && query->attrn == expected)
+               return 1;
+
+       log_warnx("warn: wrong number of parameter for %s, expected %zu", key,
+           expected);
+
+       for (i = 0; i < query->attrn; ++i)
+               free(query->attrs[i]);
+       query->attrn = 0;
+       return 0;
 }
 
 static int




Reply via email to