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);
+ }
}
}