X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libraries%2Flibldap%2Fschema.c;h=86f26e638828c28f3ecc4980e37e3796454960c7;hb=de01a6e3d791d3458549d2ceeccf4d7e0477ff78;hp=bff6c5bdbe11db353cbb016bc8a49f0a14ea314a;hpb=f07015dad2d6ccdbe5b8360bfbc601b13baae894;p=openldap diff --git a/libraries/libldap/schema.c b/libraries/libldap/schema.c index bff6c5bdbe..86f26e6388 100644 --- a/libraries/libldap/schema.c +++ b/libraries/libldap/schema.c @@ -1,7 +1,7 @@ /* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * - * Copyright 1998-2005 The OpenLDAP Foundation. + * Copyright 1998-2007 The OpenLDAP Foundation. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -1027,6 +1027,9 @@ get_token( const char ** sp, char ** token_val ) **sp != ')' && **sp != '$' && **sp != '\'' && + /* for suggested minimum upper bound on the number + * of characters (RFC 4517) */ + **sp != '{' && **sp != '\0' ) (*sp)++; q = *sp; @@ -1411,16 +1414,20 @@ add_extension(LDAPSchemaExtensionItem ***extensions, if ( !*extensions ) { *extensions = LDAP_CALLOC(2, sizeof(LDAPSchemaExtensionItem *)); - if ( !*extensions ) - return 1; + if ( !*extensions ) { + LDAP_FREE( ext ); + return 1; + } n = 0; } else { for ( n=0; (*extensions)[n] != NULL; n++ ) ; tmp = LDAP_REALLOC(*extensions, (n+2)*sizeof(LDAPSchemaExtensionItem *)); - if ( !tmp ) + if ( !tmp ) { + LDAP_FREE( ext ); return 1; + } *extensions = tmp; } (*extensions)[n] = ext; @@ -2053,7 +2060,8 @@ ldap_str2attributetype( LDAP_CONST char * s, if ( !at->at_oid ) { if ( ( flags & ( LDAP_SCHEMA_ALLOW_NO_OID | LDAP_SCHEMA_ALLOW_OID_MACRO ) ) - && (ss == savepos) ) { + && (ss == savepos) ) + { /* Backtracking */ ss = savepos; kind = get_token(&ss,&sval); @@ -2070,11 +2078,13 @@ ldap_str2attributetype( LDAP_CONST char * s, !strcasecmp(sval, "COLLECTIVE") || !strcasecmp(sval, "NO-USER-MODIFICATION") || !strcasecmp(sval, "USAGE") || - !strncasecmp(sval, "X-", 2) ) { + !strncasecmp(sval, "X-", 2) ) + { /* Missing OID, backtrack */ ss = savepos; } else if ( flags - & LDAP_SCHEMA_ALLOW_OID_MACRO) { + & LDAP_SCHEMA_ALLOW_OID_MACRO) + { /* Non-numerical OID ... */ int len = ss-savepos; at->at_oid = LDAP_MALLOC(len+1); @@ -3225,6 +3235,21 @@ ldap_str2nameform( LDAP_CONST char * s, seen_obsolete = 1; nf->nf_obsolete = LDAP_SCHEMA_YES; parse_whsp(&ss); + } else if ( !strcasecmp(sval,"OC") ) { + LDAP_FREE(sval); + if ( seen_class ) { + *code = LDAP_SCHERR_DUPOPT; + *errp = ss; + ldap_nameform_free(nf); + return(NULL); + } + seen_class = 1; + nf->nf_objectclass = parse_woid(&ss,code); + if ( !nf->nf_objectclass ) { + *errp = ss; + ldap_nameform_free(nf); + return NULL; + } } else if ( !strcasecmp(sval,"MUST") ) { LDAP_FREE(sval); if ( seen_must ) {