apr_ldap: Add support for RFC4522 binary encoding option.


git-svn-id: https://svn.apache.org/repos/asf/apr/apr/trunk@1920247 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/ldap/apr_ldap.c b/ldap/apr_ldap.c
index 1e2fc82..9ea5012 100644
--- a/ldap/apr_ldap.c
+++ b/ldap/apr_ldap.c
@@ -1568,16 +1568,32 @@
 
                 if (vals) {
 
-                    int k, nvals;
+                    int k, nvals, binary = 0;
+
+                    char *sc = attr;
+
+                    /* support for RFC4522 binary encoding option */
+                    while ((sc = strchr(sc, ';'))) {
+                        if (!strcasecmp(sc, ";binary") && (sc[7] == 0 || sc[7] == ';')) {
+                            binary = 1;
+                            break;
+                        }
+                    }
 
                     nvals = ldap_count_values_len(vals);
 
                     for (k = 0; k < nvals; k++) {
 
                         apr_buffer_t buf;
+                        char *str = NULL;
 
-                        apr_buffer_mem_set(&buf, vals[k]->bv_val, vals[k]->bv_len);
-// fixme - tell cb if binary
+                        if (binary) {
+                            apr_buffer_mem_set(&buf, vals[k]->bv_val, vals[k]->bv_len);
+                        }
+                        else {
+                            str = strndup(vals[k]->bv_val, vals[k]->bv_len);
+                            apr_buffer_str_set(&buf, str, vals[k]->bv_len);
+                        }
 
                         if (res->entry_cb.search) {
                             status = res->entry_cb.search(ldap, dn, res->nentries, nattrs, j,
@@ -1586,6 +1602,10 @@
                         else {
                             status = apr_ldap_status(err->rc, APR_EGENERAL);
                         }
+
+                        if (str) {
+                            free(str);
+                        }
                     }
 
                 }