r6726: support binary search elements in ldap_decode()
authorAndrew Tridgell <tridge@samba.org>
Wed, 11 May 2005 05:59:46 +0000 (05:59 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:16:38 +0000 (13:16 -0500)
source/libcli/ldap/ldap.c

index 37c3266b9716a2d143128e304cf6cdcabe8789af..1a4f323ebffa46f8d1c34de94f78850554f699b6 100644 (file)
@@ -140,6 +140,39 @@ static struct ldap_val ldap_binary_decode(TALLOC_CTX *mem_ctx, const char *str)
 }
 
 
+/*
+   encode a blob as a RFC2254 binary string, escaping any
+   non-printable or '\' characters
+*/
+static const char *ldap_binary_encode(TALLOC_CTX *mem_ctx, DATA_BLOB blob)
+{
+       int i;
+       char *ret;
+       int len = blob.length;
+       for (i=0;i<blob.length;i++) {
+               if (!isprint(blob.data[i]) || blob.data[i] == '\\') {
+                       len += 2;
+               }
+       }
+       ret = talloc_array(mem_ctx, char, len+1);
+       if (ret == NULL) return NULL;
+
+       len = 0;
+       for (i=0;i<blob.length;i++) {
+               if (!isprint(blob.data[i]) || blob.data[i] == '\\') {
+                       snprintf(ret+len, 4, "\\%02X", blob.data[i]);
+                       len += 3;
+               } else {
+                       ret[len++] = blob.data[i];
+               }
+       }
+
+       ret[len] = 0;
+
+       return ret;     
+}
+
+
 /*
   <simple> ::= <attributetype> <filtertype> <attributevalue>
 */
@@ -765,7 +798,7 @@ static BOOL ldap_decode_filter(TALLOC_CTX *mem_ctx, struct asn1_data *data,
                }
                asn1_end_tag(data);
 
-               filter = talloc_asprintf(mem_ctx, "%s)", filter);
+               filter = talloc_asprintf_append(filter, ")");
                break;
        }
        case 1: {
@@ -790,21 +823,24 @@ static BOOL ldap_decode_filter(TALLOC_CTX *mem_ctx, struct asn1_data *data,
 
                asn1_end_tag(data);
 
-               filter = talloc_asprintf(mem_ctx, "%s)", filter);
+               filter = talloc_asprintf_append(filter, ")");
                break;
        }
        case 3: {
                /* equalityMatch */
-               const char *attrib, *value;
+               const char *attrib;
+               DATA_BLOB value;
                if (tag_desc != 0xa0) /* context compound */
                        return False;
                asn1_start_tag(data, ASN1_CONTEXT(3));
                asn1_read_OctetString_talloc(mem_ctx, data, &attrib);
-               asn1_read_OctetString_talloc(mem_ctx, data, &value);
+               asn1_read_OctetString(data, &value);
                asn1_end_tag(data);
-               if ((data->has_error) || (attrib == NULL) || (value == NULL))
+               if ((data->has_error) || (attrib == NULL) || (value.data == NULL))
                        return False;
-               filter = talloc_asprintf(mem_ctx, "(%s=%s)", attrib, value);
+               filter = talloc_asprintf(mem_ctx, "(%s=%s)", 
+                                        attrib, ldap_binary_encode(mem_ctx, value));
+               data_blob_free(&value);
                break;
        }
        case 7: {