]> git.sur5r.net Git - openldap/blobdiff - libraries/libldif/line64.c
ITS#2153, make sure sockbuf buffer is empty before returning (-2) from
[openldap] / libraries / libldif / line64.c
index edec31540d35a8953718292501c2d8a39e98e573..3f16c95d600a5a24c213d1dae8d76f0b99d04582 100644 (file)
@@ -1,7 +1,7 @@
 /* line64.c - routines for dealing with the slapd line format */
 /* $OpenLDAP$ */
 /*
- * Copyright 1998-1999 The OpenLDAP Foundation, All Rights Reserved.
+ * Copyright 1998-2002 The OpenLDAP Foundation, All Rights Reserved.
  * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
  */
 
@@ -24,7 +24,7 @@ int ldif_debug = 0;
 
 #define RIGHT2                 0x03
 #define RIGHT4                 0x0f
-#define CONTINUED_LINE_MARKER  '\001'
+#define CONTINUED_LINE_MARKER  '\r'
 
 #ifdef CSRIMALLOC
 #define ber_memalloc malloc
@@ -116,7 +116,7 @@ ldif_parse_line(
 
        if ( *s == '\0' ) {
                /* no value */
-               value = NULL;
+               value = "";
                vlen = 0;
                goto done;
        }
@@ -223,14 +223,17 @@ done:
        }
 
        if( !url && value != NULL ) {
-               value = ber_strdup( value );
-               if( value == NULL ) {
+               p = ber_memalloc( vlen + 1 );
+               if( p == NULL ) {
                        ber_pvt_log_printf( LDAP_DEBUG_ANY, ldif_debug,
                                "ldif_parse_line: value malloc failed\n");
                        ber_memfree( type );
                        ber_memfree( freeme );
                        return( -1 );
                }
+               AC_MEMCPY( p, value, vlen );
+               p[vlen] = '\0';
+               value = p;
        }
 
        ber_memfree( freeme );
@@ -271,15 +274,22 @@ ldif_getline( char **next )
                line = *next;
 
                while ( (*next = strchr( *next, '\n' )) != NULL ) {
-                       unsigned char c = *(*next + 1);
+#if CONTINUED_LINE_MARKER != '\r'
+                       if ( (*next)[-1] == '\r' ) {
+                               (*next)[-1] = CONTINUED_LINE_MARKER;
+                       }
+#endif
 
-                       if ( !isspace( c ) || c == '\n' ) {
+                       if ( (*next)[1] != ' ' ) {
+                               if ( (*next)[1] == '\r' && (*next)[2] == '\n' ) {
+                                       *(*next)++ = '\0';
+                               }
                                *(*next)++ = '\0';
                                break;
                        }
 
                        **next = CONTINUED_LINE_MARKER;
-                       *(*next+1) = CONTINUED_LINE_MARKER;
+                       (*next)[1] = CONTINUED_LINE_MARKER;
                        (*next)++;
                }
        } while( *line == '#' );
@@ -303,6 +313,7 @@ ldif_sput(
        unsigned long   bits;
        char            *save;
        int             pad;
+       int             namelen = 0;
 
        ber_len_t savelen;
        ber_len_t len=0;
@@ -311,18 +322,15 @@ ldif_sput(
        /* prefix */
        switch( type ) {
        case LDIF_PUT_COMMENT:
-               if( name != NULL ) break;
-
                *(*out)++ = '#';
                len++;
 
                if( vlen ) {
                        *(*out)++ = ' ';
                        len++;
-                       break;
                }
 
-               /* no value, fall-thru */
+               break;
 
        case LDIF_PUT_SEP:
                *(*out)++ = '\n';
@@ -332,10 +340,10 @@ ldif_sput(
        /* name (attribute type) */
        if( name != NULL ) {
                /* put the name + ":" */
-               for ( i=0 ; name[i]; i++ ) {
-                       *(*out)++ = name[i];
-                       len++;
-               }
+               namelen = strlen(name);
+               strcpy(*out, name);
+               *out += namelen;
+               len += namelen;
 
                if( type != LDIF_PUT_COMMENT ) {
                        *(*out)++ = ':';
@@ -349,6 +357,11 @@ ldif_sput(
        }
 #endif
 
+       if( vlen == 0 ) {
+               *(*out)++ = '\n';
+               return;
+       }
+
        switch( type ) {
        case LDIF_PUT_NOVALUE:
                *(*out)++ = '\n';
@@ -395,19 +408,19 @@ ldif_sput(
        *(*out)++ = ' ';
        len++;
 
-       if( vlen == 0 ) {
-               *(*out)++ = '\n';
-               return;
-       }
-
        stop = (const unsigned char *) (val + vlen);
 
        if ( type == LDIF_PUT_VALUE
-               && isgraph( val[0] ) && val[0] != ':' && val[0] != '<'
-               && isgraph( val[vlen-1] )
+               && isgraph( (unsigned char) val[0] ) && val[0] != ':' && val[0] != '<'
+               && isgraph( (unsigned char) val[vlen-1] )
+#ifndef LDAP_BINARY_DEBUG
+               && strstr( name, ";binary" ) == NULL
+#endif
 #ifndef LDAP_PASSWD_DEBUG
-               && strcasecmp( name, "userPassword" ) != 0      /* encode userPassword */
-               && strcasecmp( name, "2.5.4.35" ) != 0          /* encode userPassword */
+               && (namelen != (sizeof("userPassword")-1)
+               || strcasecmp( name, "userPassword" ) != 0)     /* encode userPassword */
+               && (namelen != (sizeof("2.5.4.35")-1) 
+               || strcasecmp( name, "2.5.4.35" ) != 0)         /* encode userPassword */
 #endif
        ) {
                int b64 = 0;
@@ -529,8 +542,8 @@ int ldif_is_not_printable(
                return -1;
        }
 
-       if( isgraph( val[0] ) && val[0] != ':' && val[0] != '<' &&
-               isgraph( val[vlen-1] ) )
+       if( isgraph( (unsigned char) val[0] ) && val[0] != ':' && val[0] != '<' &&
+               isgraph( (unsigned char) val[vlen-1] ) )
        {
                ber_len_t i;