/* 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
*/
#define RIGHT2 0x03
#define RIGHT4 0x0f
-#define CONTINUED_LINE_MARKER '\001'
+#define CONTINUED_LINE_MARKER '\r'
#ifdef CSRIMALLOC
#define ber_memalloc malloc
if ( *s == '\0' ) {
/* no value */
- value = NULL;
+ value = "";
vlen = 0;
goto 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 );
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 == '#' );
unsigned long bits;
char *save;
int pad;
+ int namelen = 0;
ber_len_t savelen;
ber_len_t len=0;
/* 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';
/* 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)++ = ':';
}
#endif
+ if( vlen == 0 ) {
+ *(*out)++ = '\n';
+ return;
+ }
+
switch( type ) {
case LDIF_PUT_NOVALUE:
*(*out)++ = '\n';
*(*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;
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;