]> git.sur5r.net Git - openldap/blobdiff - libraries/libldap/getdn.c
ITS#3755 silence strict-aliasing warnings
[openldap] / libraries / libldap / getdn.c
index 79c49e0470caea8ae85702aec7ec292418026de6..74f136524790638869c56443fa2b6b0be4212a61 100644 (file)
@@ -1,7 +1,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 1998-2005 The OpenLDAP Foundation.
+ * Copyright 1998-2006 The OpenLDAP Foundation.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -337,16 +337,15 @@ ldap_dn2ad_canonical( LDAP_CONST char *dn )
  * from ( fin & LDAP_DN_FORMAT_MASK ) to ( fout & LDAP_DN_FORMAT_MASK )
  * 
  * fin can be one of:
- *     LDAP_DN_FORMAT_LDAP             (rfc 2253 and ldapbis liberal, 
- *                                     plus some rfc 1779)
- *     LDAP_DN_FORMAT_LDAPV3           (rfc 2253 and ldapbis)
- *     LDAP_DN_FORMAT_LDAPV2           (rfc 1779)
+ *     LDAP_DN_FORMAT_LDAP             (RFC 4514 liberal, plus some RFC 1779)
+ *     LDAP_DN_FORMAT_LDAPV3   (RFC 4514)
+ *     LDAP_DN_FORMAT_LDAPV2   (RFC 1779)
  *     LDAP_DN_FORMAT_DCE              (?)
  *
  * fout can be any of the above except
  *     LDAP_DN_FORMAT_LDAP
  * plus:
- *     LDAP_DN_FORMAT_UFN              (rfc 1781, partial and with extensions)
+ *     LDAP_DN_FORMAT_UFN              (RFC 1781, partial and with extensions)
  *     LDAP_DN_FORMAT_AD_CANONICAL     (?)
  */
 int
@@ -358,7 +357,7 @@ ldap_dn_normalize( LDAP_CONST char *dnin,
 
        Debug( LDAP_DEBUG_TRACE, "ldap_dn_normalize\n", 0, 0, 0 );
 
-       assert( dnout );
+       assert( dnout != NULL );
 
        *dnout = NULL;
 
@@ -433,14 +432,14 @@ ldap_dn_normalize( LDAP_CONST char *dnin,
 #define LDAP_DN_VALUE_END(c) \
        ( LDAP_DN_RDN_SEP(c) || LDAP_DN_AVA_SEP(c) )
 
-/* NOTE: according to draft-ietf-ldapbis-dn, '=' can be escaped
- * and treated as special, i.e. escaped both as "\<hexpair>" and
- * as "\=", but it is treated as a regular char, i.e. it can also 
- * appear as '='.
+/* NOTE: according to RFC 4514, '=' can be escaped and treated as special,
+ * i.e. escaped both as "\<hexpair>" and * as "\=", but it is treated as
+ * a regular char, i.e. it can also appear as '='.
  *
- * As such, in 2.2 we used to allow reading unescaped '=',
- * but we always produced escaped '\3D'; this changes 
- * since 2.3, if compatibility issues do not arise */
+ * As such, in 2.2 we used to allow reading unescaped '=', but we always
+ * produced escaped '\3D'; this changes since 2.3, if compatibility issues
+ * do not arise
+ */
 #define LDAP_DN_NE(c) \
        ( LDAP_DN_RDN_SEP_V2(c) || LDAP_DN_AVA_SEP(c) \
          || LDAP_DN_QUOTES(c) \
@@ -563,8 +562,8 @@ ldapava_new( const struct berval *attr, const struct berval *val,
 {
        LDAPAVA *ava;
 
-       assert( attr );
-       assert( val );
+       assert( attr != NULL );
+       assert( val != NULL );
 
        ava = LDAP_MALLOCX( sizeof( LDAPAVA ) + attr->bv_len + 1, ctx );
 
@@ -586,7 +585,7 @@ ldapava_new( const struct berval *attr, const struct berval *val,
 void
 ldapava_free( LDAPAVA *ava, void *ctx )
 {
-       assert( ava );
+       assert( ava != NULL );
 
 #if 0
        /* ava's private must be freed by caller
@@ -673,7 +672,7 @@ ldap_str2dn( LDAP_CONST char *str, LDAPDN *dn, unsigned flags )
 {
        struct berval   bv;
 
-       assert( str );
+       assert( str != NULL );
 
        bv.bv_len = strlen( str );
        bv.bv_val = (char *) str;
@@ -700,15 +699,15 @@ ldap_bv2dn_x( struct berval *bvin, LDAPDN *dn, unsigned flags, void *ctx )
        char            *str, *end;
        struct berval   bvtmp, *bv = &bvtmp;
        
-       assert( bvin );
-       assert( bvin->bv_val );
-       assert( dn );
+       assert( bvin != NULL );
+       assert( bvin->bv_val != NULL );
+       assert( dn != NULL );
 
        *bv = *bvin;
        str = bv->bv_val;
        end = str + bv->bv_len;
 
-       Debug( LDAP_DEBUG_TRACE, "=> ldap_bv2dn(%s,%u)\n", str, flags, 0 );
+       Debug( LDAP_DEBUG_ARGS, "=> ldap_bv2dn(%s,%u)\n", str, flags, 0 );
 
        *dn = NULL;
 
@@ -890,8 +889,8 @@ return_result:;
                LDAP_FREEX( tmpDN, ctx );
        }
 
-       Debug( LDAP_DEBUG_TRACE, "<= ldap_bv2dn(%s)=%d %s\n", str, rc,
-                       ldap_err2string( rc ) );
+       Debug( LDAP_DEBUG_ARGS, "<= ldap_bv2dn(%s)=%d %s\n", str, rc,
+                       rc ? ldap_err2string( rc ) : "" );
        *dn = newDN;
        
        return( rc );
@@ -911,7 +910,7 @@ ldap_str2rdn( LDAP_CONST char *str, LDAPRDN *rdn,
 {
        struct berval   bv;
 
-       assert( str );
+       assert( str != NULL );
        assert( str[ 0 ] != '\0' );     /* FIXME: is this required? */
 
        bv.bv_len = strlen( str );
@@ -949,11 +948,11 @@ ldap_bv2rdn_x( struct berval *bv, LDAPRDN *rdn,
        char            *str;
        ber_len_t       stoplen;
        
-       assert( bv );
-       assert( bv->bv_len );
-       assert( bv->bv_val );
+       assert( bv != NULL );
+       assert( bv->bv_len != 0 );
+       assert( bv->bv_val != NULL );
        assert( rdn || flags & LDAP_DN_SKIP );
-       assert( n );
+       assert( n != NULL );
 
        str = bv->bv_val;
        stoplen = bv->bv_len;
@@ -1003,15 +1002,8 @@ ldap_bv2rdn_x( struct berval *bv, LDAPRDN *rdn,
                 * an AttributeType can be encoded as:
                 * - its string representation; in detail, implementations
                 *   MUST recognize AttributeType string type names listed 
-                *   in section 2.3 of draft-ietf-ldapbis-dn-XX.txt, and
-                *   MAY recognize other names.
-                * - its numeric OID (a dotted decimal string); in detail
-                *   RFC 2253 asserts that ``Implementations MUST allow 
-                *   an oid in the attribute type to be prefixed by one 
-                *   of the character strings "oid." or "OID."''.  As soon
-                *   as draft-ietf-ldapbis-dn-XX.txt obsoletes RFC 2253 
-                *   I'm not sure whether this is required or not any 
-                *   longer; to be liberal, we still implement it.
+                *   in Section 3 of RFC 4514, and MAY recognize other names.
+                * - its numeric OID (a dotted decimal string)
                 */
                case B4AVA:
                        if ( LDAP_DN_ASCII_SPACE( p[ 0 ] ) ) {
@@ -1111,9 +1103,8 @@ ldap_bv2rdn_x( struct berval *bv, LDAPRDN *rdn,
                                if ( LDAP_DN_LANG_SEP( p[ 0 ] ) ) {
                                        
                                        /*
-                                        * RFC 2253 does not explicitly
-                                        * allow lang extensions to attribute 
-                                        * types in DNs ... 
+                                        * RFC 4514 explicitly does not allow attribute
+                                        * description options, such as language tags.
                                         */
                                        if ( flags & LDAP_DN_PEDANTIC ) {
                                                goto parsing_error;
@@ -1233,7 +1224,7 @@ ldap_bv2rdn_x( struct berval *bv, LDAPRDN *rdn,
                        }
 
                        /*
-                        * here STRING means RFC 2253 string
+                        * here STRING means RFC 4514 string
                         * FIXME: what about DCE strings? 
                         */
                        if ( !p[ 0 ] ) {
@@ -1435,9 +1426,9 @@ str2strval( const char *str, ber_len_t stoplen, struct berval *val, const char *
        const char      *p, *end, *startPos, *endPos = NULL;
        ber_len_t       len, escapes;
 
-       assert( str );
-       assert( val );
-       assert( next );
+       assert( str != NULL );
+       assert( val != NULL );
+       assert( next != NULL );
 
        *next = NULL;
        end = str + stoplen;
@@ -1581,9 +1572,9 @@ DCE2strval( const char *str, struct berval *val, const char **next, unsigned fla
        const char      *p, *startPos, *endPos = NULL;
        ber_len_t       len, escapes;
 
-       assert( str );
-       assert( val );
-       assert( next );
+       assert( str != NULL );
+       assert( val != NULL );
+       assert( next != NULL );
 
        *next = NULL;
        
@@ -1666,9 +1657,9 @@ IA52strval( const char *str, struct berval *val, const char **next, unsigned fla
        const char      *p, *startPos, *endPos = NULL;
        ber_len_t       len, escapes;
 
-       assert( str );
-       assert( val );
-       assert( next );
+       assert( str != NULL );
+       assert( val != NULL );
+       assert( next != NULL );
 
        *next = NULL;
 
@@ -1742,9 +1733,9 @@ quotedIA52strval( const char *str, struct berval *val, const char **next, unsign
        ber_len_t       len;
        unsigned        escapes = 0;
 
-       assert( str );
-       assert( val );
-       assert( next );
+       assert( str != NULL );
+       assert( val != NULL );
+       assert( next != NULL );
 
        *next = NULL;
 
@@ -1832,8 +1823,8 @@ hexstr2bin( const char *str, char *c )
 {
        char    c1, c2;
 
-       assert( str );
-       assert( c );
+       assert( str != NULL );
+       assert( c != NULL );
 
        c1 = str[ 0 ];
        c2 = str[ 1 ];
@@ -1874,9 +1865,9 @@ hexstr2binval( const char *str, struct berval *val, const char **next, unsigned
        ber_len_t       len;
        ber_len_t       s, d;
 
-       assert( str );
-       assert( val );
-       assert( next );
+       assert( str != NULL );
+       assert( val != NULL );
+       assert( next != NULL );
 
        *next = NULL;
 
@@ -1976,8 +1967,8 @@ byte2hexpair( const char *val, char *pair )
 {
        static const char       hexdig[] = "0123456789ABCDEF";
 
-       assert( val );
-       assert( pair );
+       assert( val != NULL );
+       assert( pair != NULL );
 
        /* 
         * we assume the string has enough room for the hex encoding
@@ -1998,8 +1989,8 @@ binval2hexstr( struct berval *val, char *str )
 {
        ber_len_t       s, d;
 
-       assert( val );
-       assert( str );
+       assert( val != NULL );
+       assert( str != NULL );
 
        if ( val->bv_len == 0 ) {
                return( 0 );
@@ -2025,21 +2016,22 @@ static int
 strval2strlen( struct berval *val, unsigned flags, ber_len_t *len )
 {
        ber_len_t       l, cl = 1;
-       char            *p;
+       char            *p, *end;
        int             escaped_byte_len = LDAP_DN_IS_PRETTY( flags ) ? 1 : 3;
 #ifdef PRETTY_ESCAPE
        int             escaped_ascii_len = LDAP_DN_IS_PRETTY( flags ) ? 2 : 3;
 #endif /* PRETTY_ESCAPE */
        
-       assert( val );
-       assert( len );
+       assert( val != NULL );
+       assert( len != NULL );
 
        *len = 0;
        if ( val->bv_len == 0 ) {
                return( 0 );
        }
 
-       for ( l = 0, p = val->bv_val; p < val->bv_val + val->bv_len; p += cl ) {
+       end = val->bv_val + val->bv_len - 1;
+       for ( l = 0, p = val->bv_val; p <= end; p += cl ) {
 
                /* 
                 * escape '%x00' 
@@ -2068,7 +2060,7 @@ strval2strlen( struct berval *val, unsigned flags, ber_len_t *len )
                } else if ( LDAP_DN_NEEDESCAPE( p[ 0 ] )
                                || LDAP_DN_SHOULDESCAPE( p[ 0 ] )
                                || ( p == val->bv_val && LDAP_DN_NEEDESCAPE_LEAD( p[ 0 ] ) )
-                               || ( !p[ 1 ] && LDAP_DN_NEEDESCAPE_TRAIL( p[ 0 ] ) ) ) {
+                               || ( p == end && LDAP_DN_NEEDESCAPE_TRAIL( p[ 0 ] ) ) ) {
 #ifdef PRETTY_ESCAPE
 #if 0
                        if ( LDAP_DN_WILLESCAPE_HEX( flags, p[ 0 ] ) ) {
@@ -2109,9 +2101,9 @@ strval2str( struct berval *val, char *str, unsigned flags, ber_len_t *len )
 {
        ber_len_t       s, d, end;
 
-       assert( val );
-       assert( str );
-       assert( len );
+       assert( val != NULL );
+       assert( str != NULL );
+       assert( len != NULL );
 
        if ( val->bv_len == 0 ) {
                *len = 0;
@@ -2208,8 +2200,8 @@ strval2IA5strlen( struct berval *val, unsigned flags, ber_len_t *len )
        ber_len_t       l;
        char            *p;
 
-       assert( val );
-       assert( len );
+       assert( val != NULL );
+       assert( len != NULL );
 
        *len = 0;
        if ( val->bv_len == 0 ) {
@@ -2250,9 +2242,9 @@ strval2IA5str( struct berval *val, char *str, unsigned flags, ber_len_t *len )
 {
        ber_len_t       s, d, end;
 
-       assert( val );
-       assert( str );
-       assert( len );
+       assert( val != NULL );
+       assert( str != NULL );
+       assert( len != NULL );
 
        if ( val->bv_len == 0 ) {
                *len = 0;
@@ -2298,8 +2290,8 @@ strval2DCEstrlen( struct berval *val, unsigned flags, ber_len_t *len )
        ber_len_t       l;
        char            *p;
 
-       assert( val );
-       assert( len );
+       assert( val != NULL );
+       assert( len != NULL );
 
        *len = 0;
        if ( val->bv_len == 0 ) {
@@ -2338,9 +2330,9 @@ strval2DCEstr( struct berval *val, char *str, unsigned flags, ber_len_t *len )
 {
        ber_len_t       s, d;
 
-       assert( val );
-       assert( str );
-       assert( len );
+       assert( val != NULL );
+       assert( str != NULL );
+       assert( len != NULL );
 
        if ( val->bv_len == 0 ) {
                *len = 0;
@@ -2384,8 +2376,8 @@ strval2ADstrlen( struct berval *val, unsigned flags, ber_len_t *len )
        ber_len_t       l;
        char            *p;
 
-       assert( val );
-       assert( len );
+       assert( val != NULL );
+       assert( len != NULL );
 
        *len = 0;
        if ( val->bv_len == 0 ) {
@@ -2424,9 +2416,9 @@ strval2ADstr( struct berval *val, char *str, unsigned flags, ber_len_t *len )
 {
        ber_len_t       s, d;
 
-       assert( val );
-       assert( str );
-       assert( len );
+       assert( val != NULL );
+       assert( str != NULL );
+       assert( len != NULL );
 
        if ( val->bv_len == 0 ) {
                *len = 0;
@@ -2477,9 +2469,9 @@ dn2domain( LDAPDN dn, struct berval *bv, int pos, int *iRDN )
        /* we are guaranteed there's enough memory in str */
 
        /* sanity */
-       assert( dn );
-       assert( bv );
-       assert( iRDN );
+       assert( dn != NULL );
+       assert( bv != NULL );
+       assert( iRDN != NULL );
        assert( *iRDN >= 0 );
 
        str = bv->bv_val + pos;
@@ -2488,10 +2480,10 @@ dn2domain( LDAPDN dn, struct berval *bv, int pos, int *iRDN )
                LDAPRDN         rdn;
                LDAPAVA         *ava;
 
-               assert( dn[ i ] );
+               assert( dn[ i ] != NULL );
                rdn = dn[ i ];
 
-               assert( rdn[ 0 ] );
+               assert( rdn[ 0 ] != NULL );
                ava = rdn[ 0 ];
 
                if ( !LDAP_DN_IS_RDN_DC( rdn ) ) {
@@ -2678,8 +2670,8 @@ rdn2UFNstrlen( LDAPRDN rdn, unsigned flags, ber_len_t *len )
        int             iAVA;
        ber_len_t       l = 0;
 
-       assert( rdn );
-       assert( len );
+       assert( rdn != NULL );
+       assert( len != NULL );
 
        *len = 0;
 
@@ -2757,8 +2749,8 @@ rdn2ADstrlen( LDAPRDN rdn, unsigned flags, ber_len_t *len )
        int             iAVA;
        ber_len_t       l = 0;
 
-       assert( rdn );
-       assert( len );
+       assert( rdn != NULL );
+       assert( len != NULL );
 
        *len = 0;
 
@@ -2838,7 +2830,7 @@ ldap_rdn2str( LDAPRDN rdn, char **str, unsigned flags )
        struct berval bv;
        int rc;
 
-       assert( str );
+       assert( str != NULL );
 
        if((flags & LDAP_DN_FORMAT_MASK) == LDAP_DN_FORMAT_LBER) {
                return LDAP_PARAM_ERROR;
@@ -2861,7 +2853,7 @@ ldap_rdn2bv_x( LDAPRDN rdn, struct berval *bv, unsigned flags, void *ctx )
        int             rc, back;
        ber_len_t       l;
        
-       assert( bv );
+       assert( bv != NULL );
 
        bv->bv_len = 0;
        bv->bv_val = NULL;
@@ -2971,7 +2963,7 @@ int ldap_dn2str( LDAPDN dn, char **str, unsigned flags )
        struct berval bv;
        int rc;
 
-       assert( str );
+       assert( str != NULL );
 
        if((flags & LDAP_DN_FORMAT_MASK) == LDAP_DN_FORMAT_LBER) {
                return LDAP_PARAM_ERROR;
@@ -2997,11 +2989,11 @@ int ldap_dn2bv_x( LDAPDN dn, struct berval *bv, unsigned flags, void *ctx )
        int ( *sv2l ) ( struct berval *v, unsigned f, ber_len_t *l );
        int ( *sv2s ) ( struct berval *v, char *s, unsigned f, ber_len_t *l );
 
-       assert( bv );
+       assert( bv != NULL );
        bv->bv_len = 0;
        bv->bv_val = NULL;
 
-       Debug( LDAP_DEBUG_TRACE, "=> ldap_dn2bv(%u)\n", flags, 0, 0 );
+       Debug( LDAP_DEBUG_ARGS, "=> ldap_dn2bv(%u)\n", flags, 0, 0 );
 
        /* 
         * a null dn means an empty dn string 
@@ -3310,8 +3302,8 @@ int ldap_dn2bv_x( LDAPDN dn, struct berval *bv, unsigned flags, void *ctx )
                return LDAP_PARAM_ERROR;
        }
 
-       Debug( LDAP_DEBUG_TRACE, "<= ldap_dn2bv(%s)=%d %s\n",
-               bv->bv_val, rc, ldap_err2string( rc ) );
+       Debug( LDAP_DEBUG_ARGS, "<= ldap_dn2bv(%s)=%d %s\n",
+               bv->bv_val, rc, rc ? ldap_err2string( rc ) : "" );
 
 return_results:;
        return( rc );
@@ -3356,7 +3348,7 @@ ldap_X509dn2bv( void *x509_name, struct berval *bv, LDAPDN_rewrite_func *func,
 
        struct berval   Val;
 
-       assert( bv );
+       assert( bv != NULL );
        bv->bv_len = 0;
        bv->bv_val = NULL;
 
@@ -3378,7 +3370,7 @@ ldap_X509dn2bv( void *x509_name, struct berval *bv, LDAPDN_rewrite_func *func,
                if ( newDN == NULL )
                        return LDAP_NO_MEMORY;
        } else {
-               newDN = (LDAPDN)ptrs;
+               newDN = (LDAPDN)(char *)ptrs;
        }
        
        newDN[nrdns] = NULL;
@@ -3510,7 +3502,7 @@ nomem:
 
        if ( oidsize != 0 )
                LDAP_FREE( oidbuf );
-       if ( newDN != (LDAPDN) ptrs )
+       if ( newDN != (LDAPDN)(char *) ptrs )
                LDAP_FREE( newDN );
        return rc;
 }