]> git.sur5r.net Git - openldap/commitdiff
Add ldap_bv2escaped_filter_value (ITS#2535)
authorKurt Zeilenga <kurt@openldap.org>
Thu, 13 Oct 2005 06:35:28 +0000 (06:35 +0000)
committerKurt Zeilenga <kurt@openldap.org>
Thu, 13 Oct 2005 06:35:28 +0000 (06:35 +0000)
include/ldap.h
libraries/libldap/search.c

index 67c9a7bcead4e83daf724acc5a582bcdf9cbff1e..1a01f462fdc5722498f5a49cb0dd75f7c4e2e175 100644 (file)
@@ -1665,6 +1665,11 @@ ldap_msgdelete LDAP_P((
  * in search.c:
  */
 LDAP_F( int )
+ldap_bv2escaped_filter_value LDAP_P(( 
+       struct berval *in, 
+       struct berval *out ));
+
+LDAP_F( int )
 ldap_search_ext LDAP_P((
        LDAP                    *ld,
        LDAP_CONST char *base,
index a2d97a3e01755b8ee780b5929c7ad56de38a15a9..83202ace806b531c6bec2adb09022ee2c83ba726 100644 (file)
@@ -365,3 +365,53 @@ ldap_search_s(
        return( ldap_result2error( ld, *res, 0 ) );
 }
 
+int
+ldap_bv2escaped_filter_value( struct berval *in, struct berval *out )
+{
+       char c;
+       ber_len_t i;
+       static char escape[128] = {
+               1, 1, 1, 1, 1, 1, 1, 1,
+               1, 1, 1, 1, 1, 1, 1, 1,
+               1, 1, 1, 1, 1, 1, 1, 1,
+               1, 1, 1, 1, 1, 1, 1, 1,
+
+               1, 1, 1, 0, 0, 0, 0, 0,
+               0, 0, 0, 0, 0, 0, 0, 0,
+               0, 0, 0, 0, 0, 0, 0, 0,
+               0, 0, 0, 0, 0, 0, 0, 0,
+
+               0, 0, 0, 0, 0, 0, 0, 0,
+               0, 0, 0, 0, 0, 0, 0, 0,
+               0, 0, 0, 0, 0, 0, 0, 0,
+               0, 0, 0, 0, 0, 0, 0, 0,
+
+               0, 0, 0, 0, 0, 0, 0, 0,
+               0, 0, 0, 0, 0, 0, 0, 0,
+               0, 0, 0, 0, 0, 0, 0, 0,
+               0, 0, 0, 0, 0, 0, 0, 1
+       };
+
+       out->bv_len = 0;
+       out->bv_val = NULL;
+
+       if( in->bv_len == 0 ) return 0;
+
+       /* assume we'll escape everything */
+       out->bv_val = LDAP_MALLOC( 3 * in->bv_len + 1 );
+       if( out->bv_val == NULL ) return -1;
+
+       for( i=0; i<in->bv_len; i++ ) {
+               if (c & 0x80 || escape[in->bv_val[i]]) {
+                       out->bv_val[out->bv_len++] = '\\';
+                       out->bv_val[out->bv_len++] = "0123456789ABCDEF"[0x0f & (c>>4)];
+                       out->bv_val[out->bv_len++] = "0123456789ABCDEF"[0x0f & c];
+               } else {
+                       out->bv_val[out->bv_len++] = c;
+               }
+       }
+
+       out->bv_val[out->bv_len] = '\0';
+       return 0;
+}
+