X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libraries%2Flibldap%2Fschema.c;h=cf7a9923c47c807cfeae7a0a51dde41c51c3f5b0;hb=c1a257a83f3d8b9565238b5f9b8cad39a6194f63;hp=06c41b094d6f1bfa7e75be62a11346b90d5d8961;hpb=ec87e9e30f7cde21ac4b5ab0a8b01225e98fb8bc;p=openldap diff --git a/libraries/libldap/schema.c b/libraries/libldap/schema.c index 06c41b094d..cf7a9923c4 100644 --- a/libraries/libldap/schema.c +++ b/libraries/libldap/schema.c @@ -126,6 +126,10 @@ append_to_safe_string(safe_string * ss, char * s) /* We always make sure there is at least one position available */ if ( ss->pos + l >= ss->size-1 ) { ss->size *= 2; + if ( ss->pos + l >= ss->size-1 ) { + ss->size = ss->pos + l + 1; + } + temp = LDAP_REALLOC(ss->val, ss->size); if ( !temp ) { /* Trouble, out of memory */ @@ -732,7 +736,7 @@ parse_whsp(const char **sp) */ /* Parse a sequence of dot-separated decimal strings */ -static char * +char * parse_numericoid(const char **sp, int *code, const int flags) { char * res; @@ -1654,7 +1658,9 @@ ldap_str2attributetype( const char * s, int * code, const char ** errp, const in savepos = ss; at->at_oid = parse_numericoid(&ss,code,0); if ( !at->at_oid ) { - if ( flags & LDAP_SCHEMA_ALLOW_NO_OID ) { + if ( ( flags & ( LDAP_SCHEMA_ALLOW_NO_OID + | LDAP_SCHEMA_ALLOW_OID_MACRO ) ) + && (ss == savepos) ) { /* Backtracking */ ss = savepos; kind = get_token(&ss,&sval); @@ -1674,8 +1680,13 @@ ldap_str2attributetype( const char * s, int * code, const char ** errp, const in !strncmp(sval, "X-", 2) ) { /* Missing OID, backtrack */ ss = savepos; - } else { - /* Non-numerical OID, ignore */ + } else if ( flags + & LDAP_SCHEMA_ALLOW_OID_MACRO) { + /* Non-numerical OID ... */ + int len = ss-savepos; + at->at_oid = LDAP_MALLOC(len+1); + strncpy(at->at_oid, savepos, len); + at->at_oid[len] = 0; } } LDAP_FREE(sval); @@ -1820,15 +1831,38 @@ ldap_str2attributetype( const char * s, int * code, const char ** errp, const in } seen_syntax = 1; parse_whsp(&ss); + savepos = ss; at->at_syntax_oid = parse_noidlen(&ss, code, &at->at_syntax_len, flags); if ( !at->at_syntax_oid ) { + if ( flags & LDAP_SCHEMA_ALLOW_OID_MACRO ) { + kind = get_token(&ss,&sval); + if (kind == TK_BAREWORD) + { + char *sp = strchr(sval, '{'); + at->at_syntax_oid = sval; + if (sp) + { + *sp++ = 0; + at->at_syntax_len = atoi(sp); + while ( LDAP_DIGIT(*sp) ) + sp++; + if ( *sp != '}' ) { + *code = LDAP_SCHERR_UNEXPTOKEN; + *errp = ss; + ldap_attributetype_free(at); + return NULL; + } + } + } + } else { *errp = ss; ldap_attributetype_free(at); return NULL; + } } parse_whsp(&ss); } else if ( !strcmp(sval,"SINGLE-VALUE") ) { @@ -1998,7 +2032,7 @@ ldap_str2objectclass( const char * s, int * code, const char ** errp, const int savepos = ss; oc->oc_oid = parse_numericoid(&ss,code,0); if ( !oc->oc_oid ) { - if ( flags & LDAP_SCHEMA_ALLOW_ALL ) { + if ( (flags & LDAP_SCHEMA_ALLOW_ALL) && (ss == savepos) ) { /* Backtracking */ ss = savepos; kind = get_token(&ss,&sval); @@ -2014,8 +2048,13 @@ ldap_str2objectclass( const char * s, int * code, const char ** errp, const int !strncmp(sval, "X-", 2) ) { /* Missing OID, backtrack */ ss = savepos; - } else { + } else if ( flags & + LDAP_SCHEMA_ALLOW_OID_MACRO ) { /* Non-numerical OID, ignore */ + int len = ss-savepos; + oc->oc_oid = LDAP_MALLOC(len+1); + strncpy(oc->oc_oid, savepos, len); + oc->oc_oid[len] = 0; } } LDAP_FREE(sval);