]> git.sur5r.net Git - openldap/commitdiff
make UTF8STringNormalize handle NUL
authorPierangelo Masarati <ando@openldap.org>
Wed, 13 Feb 2002 21:25:57 +0000 (21:25 +0000)
committerPierangelo Masarati <ando@openldap.org>
Wed, 13 Feb 2002 21:25:57 +0000 (21:25 +0000)
include/lber.h
libraries/liblber/memory.c
servers/slapd/schema_init.c

index c031ec1d96b517d684e18dc3bf04bdbc127b6e62..1a0316b218da6730429e541e7b86ac317451454e 100644 (file)
@@ -567,6 +567,10 @@ LBER_F( struct berval * )
 ber_str2bv LDAP_P((
        LDAP_CONST char *, ber_len_t len, int dup, struct berval *bv));
 
+LBER_F( struct berval * )
+ber_mem2bv LDAP_P((
+       LDAP_CONST char *, ber_len_t len, int dup, struct berval *bv));
+
 #define        ber_bvstr(a)    ber_str2bv(a, 0, 0, NULL)
 #define        ber_bvstrdup(a) ber_str2bv(a, 0, 1, NULL)
 
index 8cdad0ec8b0a7bee67d9fedd2c550d92b978eaf1..b8692e1d576d19f1652715645628e261351212a0 100644 (file)
@@ -523,6 +523,46 @@ ber_str2bv(
        return( new );
 }
 
+struct berval *
+ber_mem2bv(
+       LDAP_CONST char *s, ber_len_t len, int dup, struct berval *bv)
+{
+       struct berval *new;
+
+       ber_int_options.lbo_valid = LBER_INITIALIZED;
+
+       if( s == NULL || len == 0 ) {
+               ber_errno = LBER_ERROR_PARAM;
+               return NULL;
+       }
+
+       if( bv ) {
+               new = bv;
+       } else {
+               if(( new = LBER_MALLOC( sizeof(struct berval) )) == NULL ) {
+                       ber_errno = LBER_ERROR_MEMORY;
+                       return NULL;
+               }
+       }
+
+       new->bv_len = len;
+       if ( dup ) {
+               if ( (new->bv_val = LBER_MALLOC( new->bv_len+1 )) == NULL ) {
+                       ber_errno = LBER_ERROR_MEMORY;
+                       if ( !bv )
+                               LBER_FREE( new );
+                       return NULL;
+               }
+
+               AC_MEMCPY( new->bv_val, s, new->bv_len );
+               new->bv_val[new->bv_len] = '\0';
+       } else {
+               new->bv_val = (char *) s;
+       }
+
+       return( new );
+}
+
 char *
 ber_strdup( LDAP_CONST char *s )
 {
index a6e68b5316721997755004752f622fd9712cbcb8..a392547a61283f5271bb64aa8d9ef5b38ea55143 100644 (file)
@@ -522,7 +522,7 @@ UTF8StringNormalize(
        struct berval *val,
        struct berval *normalized )
 {
-       char *p, *q, *s;
+       char *p, *q, *s, *e;
        int len = 0;
 
        p = val->bv_val;
@@ -537,14 +537,15 @@ UTF8StringNormalize(
                return LDAP_INVALID_SYNTAX;
        }
 
-       ber_str2bv( p, val->bv_len - (p - val->bv_val), 1, normalized );
+       ber_mem2bv( p, val->bv_len - (p - val->bv_val), 1, normalized );
+       e = normalized->bv_val + val->bv_len - (p - val->bv_val);
 
        assert( normalized->bv_val );
 
        p = q = normalized->bv_val;
        s = NULL;
 
-       while ( *p ) {
+       while ( p < e ) {
                q += len;
                if ( ASCII_SPACE( *p ) ) {
                        s = q - len;