X-Git-Url: https://git.deb.at/w?p=pkg%2Fabook.git;a=blobdiff_plain;f=ldif.c;h=56e4d26bcf680a1fda4873c46eee0eed41a554d3;hp=46230ad6af853dfa93610349188a4f317ace46b3;hb=HEAD;hpb=7dca83329bb3ce545d6d03e10754999b9a82ca01 diff --git a/ldif.c b/ldif.c index 46230ad..56e4d26 100644 --- a/ldif.c +++ b/ldif.c @@ -1,5 +1,6 @@ /* + * $Id$ * adapted to use with abook by JH */ @@ -29,7 +30,7 @@ #define LDAP_DEBUG_PARSE 0x800 #define LDAP_DEBUG_ANY 0xffff -#define LDIF_LINE_WIDTH 76 /* maximum length of LDIF lines */ +#define LDIF_LINE_WIDTH 76 /* maximum length of LDIF lines */ #define LDIF_BASE64_LEN(vlen) (((vlen) * 4 / 3 ) + 3) #define LDIF_SIZE_NEEDED(tlen,vlen) \ @@ -44,7 +45,7 @@ #define CONTINUED_LINE_MARKER '\001' static char nib2b64[0x40f] = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; static unsigned char b642nib[0x80] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, @@ -73,110 +74,107 @@ static unsigned char b642nib[0x80] = { */ int -str_parse_line( - char *line, - char **type, - char **value, - int *vlen -) +str_parse_line(char *line, char **type, char **value, int *vlen) { - char *p, *s, *d, *byte, *stop; - char nib; - int i, b64; + char *p, *s, *d, *byte, *stop; + char nib; + int i, b64; /* skip any leading space */ - while ( ISSPACE( *line ) ) { + while(ISSPACE(*line)) { line++; } *type = line; - for ( s = line; *s && *s != ':'; s++ ) - ; /* NULL */ - if ( *s == '\0' ) { - Debug( LDAP_DEBUG_PARSE, "parse_line missing ':'\n", 0, 0, 0 ); - return( -1 ); + for(s = line; *s && *s != ':'; s++); /* NULL */ + if(*s == '\0') { + Debug(LDAP_DEBUG_PARSE, "parse_line missing ':'\n", 0, 0, + 0); + return (-1); } /* trim any space between type and : */ - for ( p = s - 1; p > line && ISSPACE( *p ); p-- ) { + for(p = s - 1; p > line && ISSPACE(*p); p--) { *p = '\0'; } *s++ = '\0'; /* check for double : - indicates base 64 encoded value */ - if ( *s == ':' ) { + if(*s == ':') { s++; b64 = 1; - /* single : - normally encoded value */ + /* single : - normally encoded value */ } else { b64 = 0; } /* skip space between : and value */ - while ( ISSPACE( *s ) ) { + while(ISSPACE(*s)) { s++; } /* if no value is present, error out */ - if ( *s == '\0' ) { - Debug( LDAP_DEBUG_PARSE, "parse_line missing value\n", 0,0,0 ); - return( -1 ); + if(*s == '\0') { + Debug(LDAP_DEBUG_PARSE, "parse_line missing value\n", 0, 0, + 0); + return (-1); } /* check for continued line markers that should be deleted */ - for ( p = s, d = s; *p; p++ ) { - if ( *p != CONTINUED_LINE_MARKER ) + for(p = s, d = s; *p; p++) { + if(*p != CONTINUED_LINE_MARKER) *d++ = *p; } *d = '\0'; *value = s; - if ( b64 ) { - stop = strchr( s, '\0' ); + if(b64) { + stop = strchr(s, '\0'); byte = s; - for ( p = s, *vlen = 0; p < stop; p += 4, *vlen += 3 ) { - for ( i = 0; i < 3; i++ ) { - if ( p[i] != '=' && (p[i] & 0x80 || - b642nib[ p[i] & 0x7f ] > 0x3f) ) { - Debug( LDAP_DEBUG_ANY, - "invalid base 64 encoding char (%c) 0x%x\n", - p[i], p[i], 0 ); - return( -1 ); + for(p = s, *vlen = 0; p < stop; p += 4, *vlen += 3) { + for(i = 0; i < 3; i++) { + if(p[i] != '=' && (p[i] & 0x80 || + b642nib[p[i] & 0x7f] > + 0x3f)) { + Debug(LDAP_DEBUG_ANY, + "invalid base 64 encoding char (%c) 0x%x\n", + p[i], p[i], 0); + return (-1); } } /* first digit */ - nib = b642nib[ p[0] & 0x7f ]; + nib = b642nib[p[0] & 0x7f]; byte[0] = nib << 2; /* second digit */ - nib = b642nib[ p[1] & 0x7f ]; + nib = b642nib[p[1] & 0x7f]; byte[0] |= nib >> 4; byte[1] = (nib & RIGHT4) << 4; /* third digit */ - if ( p[2] == '=' ) { + if(p[2] == '=') { *vlen += 1; break; } - nib = b642nib[ p[2] & 0x7f ]; + nib = b642nib[p[2] & 0x7f]; byte[1] |= nib >> 2; byte[2] = (nib & RIGHT2) << 6; /* fourth digit */ - if ( p[3] == '=' ) { + if(p[3] == '=') { *vlen += 2; break; } - nib = b642nib[ p[3] & 0x7f ]; + nib = b642nib[p[3] & 0x7f]; byte[2] |= nib; byte += 3; } - s[ *vlen ] = '\0'; + s[*vlen] = '\0'; } else { *vlen = (int) (d - s); } - return( 0 ); + return (0); } #if 0 @@ -196,21 +194,21 @@ str_parse_line( */ char * -str_getline( char **next ) +str_getline(char **next) { - char *l; - char c; + char *l; + char c; - if ( *next == NULL || **next == '\n' || **next == '\0' ) { - return( NULL ); + if(*next == NULL || **next == '\n' || **next == '\0') { + return (NULL); } l = *next; - while ( (*next = strchr( *next, '\n' )) != NULL ) { + while((*next = strchr(*next, '\n')) != NULL) { c = *(*next + 1); - if ( ISSPACE( c ) && c != '\n' ) { + if(ISSPACE(c) && c != '\n') { **next = CONTINUED_LINE_MARKER; - *(*next+1) = CONTINUED_LINE_MARKER; + *(*next + 1) = CONTINUED_LINE_MARKER; } else { *(*next)++ = '\0'; break; @@ -218,23 +216,23 @@ str_getline( char **next ) (*next)++; } - return( l ); + return (l); } #endif void -put_type_and_value( char **out, char *t, char *val, int vlen ) +put_type_and_value(char **out, char *t, char *val, int vlen) { - unsigned char *byte, *p, *stop; - unsigned char buf[3]; - unsigned long bits; - char *save; - int i, b64, pad, len, savelen; + unsigned char *byte, *p, *stop; + unsigned char buf[3]; + unsigned long bits; + char *save; + int i, b64, pad, len, savelen; len = 0; /* put the type + ": " */ - for ( p = (unsigned char *) t; *p; p++, len++ ) { + for(p = (unsigned char *) t; *p; p++, len++) { *(*out)++ = *p; } *(*out)++ = ':'; @@ -245,16 +243,16 @@ put_type_and_value( char **out, char *t, char *val, int vlen ) b64 = 0; stop = (unsigned char *) (val + vlen); - if ( isascii( val[0] ) && (ISSPACE( val[0] ) || val[0] == ':') ) { + if(isascii(val[0]) && (ISSPACE(val[0]) || val[0] == ':')) { b64 = 1; } else { - for ( byte = (unsigned char *) val; byte < stop; - byte++, len++ ) { - if ( !isascii( *byte ) || !isprint( *byte ) ) { + for(byte = (unsigned char *) val; byte < stop; + byte++, len++) { + if(!isascii(*byte) || !isprint(*byte)) { b64 = 1; break; } - if ( len > LDIF_LINE_WIDTH ) { + if(len > LDIF_LINE_WIDTH) { *(*out)++ = '\n'; *(*out)++ = ' '; len = 1; @@ -262,36 +260,37 @@ put_type_and_value( char **out, char *t, char *val, int vlen ) *(*out)++ = *byte; } } - if ( b64 ) { + if(b64) { *out = save; *(*out)++ = ':'; *(*out)++ = ' '; len = savelen + 2; /* convert to base 64 (3 bytes => 4 base 64 digits) */ - for ( byte = (unsigned char *) val; byte < stop - 2; - byte += 3 ) { + for(byte = (unsigned char *) val; byte < stop - 2; + byte += 3) { bits = (byte[0] & 0xff) << 16; bits |= (byte[1] & 0xff) << 8; bits |= (byte[2] & 0xff); - for ( i = 0; i < 4; i++, len++, bits <<= 6 ) { - if ( len > LDIF_LINE_WIDTH ) { + for(i = 0; i < 4; i++, len++, bits <<= 6) { + if(len > LDIF_LINE_WIDTH) { *(*out)++ = '\n'; *(*out)++ = ' '; len = 1; } /* get b64 digit from high order 6 bits */ - *(*out)++ = nib2b64[ (bits & 0xfc0000L) >> 18 ]; + *(*out)++ = + nib2b64[(bits & 0xfc0000L) >> 18]; } } /* add padding if necessary */ - if ( byte < stop ) { - for ( i = 0; byte + i < stop; i++ ) { + if(byte < stop) { + for(i = 0; byte + i < stop; i++) { buf[i] = byte[i]; } - for ( pad = 0; i < 3; i++, pad++ ) { + for(pad = 0; i < 3; i++, pad++) { buf[i] = '\0'; } byte = buf; @@ -299,18 +298,19 @@ put_type_and_value( char **out, char *t, char *val, int vlen ) bits |= (byte[1] & 0xff) << 8; bits |= (byte[2] & 0xff); - for ( i = 0; i < 4; i++, len++, bits <<= 6 ) { - if ( len > LDIF_LINE_WIDTH ) { + for(i = 0; i < 4; i++, len++, bits <<= 6) { + if(len > LDIF_LINE_WIDTH) { *(*out)++ = '\n'; *(*out)++ = ' '; len = 1; } /* get b64 digit from low order 6 bits */ - *(*out)++ = nib2b64[ (bits & 0xfc0000L) >> 18 ]; + *(*out)++ = + nib2b64[(bits & 0xfc0000L) >> 18]; } - for ( ; pad > 0; pad-- ) { + for(; pad > 0; pad--) { *(*out - pad) = '='; } } @@ -320,23 +320,28 @@ put_type_and_value( char **out, char *t, char *val, int vlen ) char * -ldif_type_and_value( char *type, char *val, int vlen ) +ldif_type_and_value(char *type, char *val, int vlen) /* * return malloc'd, zero-terminated LDIF line */ { - char *buf, *p; - int tlen; + char *buf, *p; + int tlen; + size_t bufsize, t; - tlen = strlen( type ); - if (( buf = (char *)malloc( LDIF_SIZE_NEEDED( tlen, vlen ) + 1 )) != - NULL ) { - } + tlen = strlen(type); - p = buf; - put_type_and_value( &p, type, val, vlen ); - *p = '\0'; + t = LDIF_SIZE_NEEDED(tlen, vlen); + if((bufsize = t + 1) <= t) + return NULL; - return( buf ); -} + if((buf = malloc(bufsize)) == NULL) { + return NULL; + } + p = buf; + put_type_and_value(&p, type, val, vlen); + *p = '\0'; + + return (buf); +}