X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libraries%2Flibldap%2Fschema.c;h=4fd83bc4bd182bbd95ba5eb69c4014bca89fd0c4;hb=70092b38fb23b9141a2b8414fb5a9c5200f3c12d;hp=09fad74a03ee9892380a63e9ebd373d6ff3a9443;hpb=6b9b0660c996e5f34e13274c5781f4899d80f84a;p=openldap diff --git a/libraries/libldap/schema.c b/libraries/libldap/schema.c index 09fad74a03..4fd83bc4bd 100644 --- a/libraries/libldap/schema.c +++ b/libraries/libldap/schema.c @@ -1,6 +1,6 @@ /* $OpenLDAP$ */ /* - * Copyright 1999-2000 The OpenLDAP Foundation, All Rights Reserved. + * Copyright 1999-2002 The OpenLDAP Foundation, All Rights Reserved. * COPYING RESTRICTIONS APPLY, see COPYRIGHT file */ /* @@ -20,8 +20,8 @@ #include -static LDAP_CONST char * -choose_name( char *names[], LDAP_CONST char *fallback ) +static const char * +choose_name( char *names[], const char *fallback ) { return( (names != NULL && names[0] != NULL) ? names[0] : fallback ); } @@ -110,6 +110,17 @@ safe_string_val(safe_string * ss) return(ss->val); } +static char * +safe_strdup(safe_string * ss) +{ + char *ret = LDAP_MALLOC(ss->pos+1); + if (!ret) + return NULL; + AC_MEMCPY(ret, ss->val, ss->pos); + ret[ss->pos] = '\0'; + return ret; +} + static int append_to_safe_string(safe_string * ss, char * s) { @@ -296,10 +307,19 @@ print_extensions(safe_string *ss, LDAPSchemaExtensionItem **extensions) } char * -ldap_syntax2str( const LDAPSyntax * syn ) +ldap_syntax2str( LDAPSyntax * syn ) +{ + struct berval bv; + if (ldap_syntax2bv( syn, &bv )) + return(bv.bv_val); + else + return NULL; +} + +struct berval * +ldap_syntax2bv( LDAPSyntax * syn, struct berval *bv ) { safe_string * ss; - char * retstring; ss = new_safe_string(256); if ( !ss ) @@ -322,16 +342,26 @@ ldap_syntax2str( const LDAPSyntax * syn ) print_literal(ss,/*(*/ ")"); - retstring = LDAP_STRDUP(safe_string_val(ss)); + bv->bv_val = safe_strdup(ss); + bv->bv_len = ss->pos; safe_string_free(ss); - return(retstring); + return(bv); } char * -ldap_matchingrule2str( const LDAPMatchingRule * mr ) +ldap_matchingrule2str( LDAPMatchingRule * mr ) +{ + struct berval bv; + if (ldap_matchingrule2bv( mr, &bv )) + return(bv.bv_val); + else + return NULL; +} + +struct berval * +ldap_matchingrule2bv( LDAPMatchingRule * mr, struct berval *bv ) { safe_string * ss; - char * retstring; ss = new_safe_string(256); if ( !ss ) @@ -371,16 +401,26 @@ ldap_matchingrule2str( const LDAPMatchingRule * mr ) print_literal(ss,/*(*/")"); - retstring = LDAP_STRDUP(safe_string_val(ss)); + bv->bv_val = safe_strdup(ss); + bv->bv_len = ss->pos; safe_string_free(ss); - return(retstring); + return(bv); } char * -ldap_matchingruleuse2str( const LDAPMatchingRuleUse * mru ) +ldap_matchingruleuse2str( LDAPMatchingRuleUse * mru ) +{ + struct berval bv; + if (ldap_matchingruleuse2bv( mru, &bv )) + return(bv.bv_val); + else + return NULL; +} + +struct berval * +ldap_matchingruleuse2bv( LDAPMatchingRuleUse * mru, struct berval *bv ) { safe_string * ss; - char * retstring; ss = new_safe_string(256); if ( !ss ) @@ -420,16 +460,26 @@ ldap_matchingruleuse2str( const LDAPMatchingRuleUse * mru ) print_literal(ss,/*(*/")"); - retstring = LDAP_STRDUP(safe_string_val(ss)); + bv->bv_val = safe_strdup(ss); + bv->bv_len = ss->pos; safe_string_free(ss); - return(retstring); + return(bv); } char * -ldap_objectclass2str( const LDAPObjectClass * oc ) +ldap_objectclass2str( LDAPObjectClass * oc ) +{ + struct berval bv; + if (ldap_objectclass2bv( oc, &bv )) + return(bv.bv_val); + else + return NULL; +} + +struct berval * +ldap_objectclass2bv( LDAPObjectClass * oc, struct berval *bv ) { safe_string * ss; - char * retstring; ss = new_safe_string(256); if ( !ss ) @@ -499,16 +549,26 @@ ldap_objectclass2str( const LDAPObjectClass * oc ) print_literal(ss, /*(*/")"); - retstring = LDAP_STRDUP(safe_string_val(ss)); + bv->bv_val = safe_strdup(ss); + bv->bv_len = ss->pos; safe_string_free(ss); - return(retstring); + return(bv); } char * -ldap_attributetype2str( const LDAPAttributeType * at ) +ldap_attributetype2str( LDAPAttributeType * at ) +{ + struct berval bv; + if (ldap_attributetype2bv( at, &bv )) + return(bv.bv_val); + else + return NULL; +} + +struct berval * +ldap_attributetype2bv( LDAPAttributeType * at, struct berval *bv ) { safe_string * ss; - char * retstring; ss = new_safe_string(256); if ( !ss ) @@ -602,9 +662,10 @@ ldap_attributetype2str( const LDAPAttributeType * at ) print_literal(ss,/*(*/")"); - retstring = LDAP_STRDUP(safe_string_val(ss)); + bv->bv_val = safe_strdup(ss); + bv->bv_len = ss->pos; safe_string_free(ss); - return(retstring); + return(bv); } /* @@ -646,7 +707,7 @@ struct token { }; static int -get_token(const char ** sp, char ** token_val) +get_token( const char ** sp, char ** token_val ) { int kind; const char * p; @@ -736,10 +797,10 @@ parse_whsp(const char **sp) */ /* Parse a sequence of dot-separated decimal strings */ -static char * -parse_numericoid(const char **sp, int *code, const int flags) +char * +ldap_int_parse_numericoid(const char **sp, int *code, const int flags) { - char * res; + char * res = NULL; const char * start = *sp; int len; int quoted = 0; @@ -770,22 +831,25 @@ parse_numericoid(const char **sp, int *code, const int flags) } /* Now *sp points at the char past the numericoid. Perfect. */ len = *sp - start; - res = LDAP_MALLOC(len+1); - if (!res) { - *code = LDAP_SCHERR_OUTOFMEM; - return(NULL); - } - strncpy(res,start,len); - res[len] = '\0'; if ( flags & LDAP_SCHEMA_ALLOW_QUOTED && quoted ) { if ( **sp == '\'' ) { (*sp)++; } else { *code = LDAP_SCHERR_UNEXPTOKEN; - LDAP_FREE(res); return NULL; } } + if (flags & LDAP_SCHEMA_SKIP) { + res = (char *)start; + } else { + res = LDAP_MALLOC(len+1); + if (!res) { + *code = LDAP_SCHERR_OUTOFMEM; + return(NULL); + } + strncpy(res,start,len); + res[len] = '\0'; + } return(res); } @@ -889,7 +953,7 @@ parse_noidlen(const char **sp, int *code, int *len, int allow_quoted) quoted = 1; (*sp)++; } - sval = parse_numericoid(sp, code, 0); + sval = ldap_int_parse_numericoid(sp, code, 0); if ( !sval ) { return NULL; } @@ -1076,14 +1140,17 @@ void ldap_syntax_free( LDAPSyntax * syn ) { LDAP_FREE(syn->syn_oid); - LDAP_VFREE(syn->syn_names); - LDAP_FREE(syn->syn_desc); + if (syn->syn_names) LDAP_VFREE(syn->syn_names); + if (syn->syn_desc) LDAP_FREE(syn->syn_desc); free_extensions(syn->syn_extensions); LDAP_FREE(syn); } LDAPSyntax * -ldap_str2syntax( const char * s, int * code, const char ** errp, const int flags ) +ldap_str2syntax( LDAP_CONST char * s, + int * code, + LDAP_CONST char ** errp, + LDAP_CONST int flags ) { int kind; const char * ss = s; @@ -1116,7 +1183,7 @@ ldap_str2syntax( const char * s, int * code, const char ** errp, const int flags } parse_whsp(&ss); - syn->syn_oid = parse_numericoid(&ss,code,0); + syn->syn_oid = ldap_int_parse_numericoid(&ss,code,0); if ( !syn->syn_oid ) { *errp = ss; ldap_syntax_free(syn); @@ -1214,15 +1281,18 @@ void ldap_matchingrule_free( LDAPMatchingRule * mr ) { LDAP_FREE(mr->mr_oid); - LDAP_VFREE(mr->mr_names); - LDAP_FREE(mr->mr_desc); - LDAP_FREE(mr->mr_syntax_oid); + if (mr->mr_names) LDAP_VFREE(mr->mr_names); + if (mr->mr_desc) LDAP_FREE(mr->mr_desc); + if (mr->mr_syntax_oid) LDAP_FREE(mr->mr_syntax_oid); free_extensions(mr->mr_extensions); LDAP_FREE(mr); } LDAPMatchingRule * -ldap_str2matchingrule( const char * s, int * code, const char ** errp, const int flags ) +ldap_str2matchingrule( LDAP_CONST char * s, + int * code, + LDAP_CONST char ** errp, + LDAP_CONST int flags ) { int kind; const char * ss = s; @@ -1259,7 +1329,7 @@ ldap_str2matchingrule( const char * s, int * code, const char ** errp, const int parse_whsp(&ss); savepos = ss; - mr->mr_oid = parse_numericoid(&ss,code,flags); + mr->mr_oid = ldap_int_parse_numericoid(&ss,code,flags); if ( !mr->mr_oid ) { if ( flags & LDAP_SCHEMA_ALLOW_NO_OID ) { /* Backtracking */ @@ -1360,7 +1430,7 @@ ldap_str2matchingrule( const char * s, int * code, const char ** errp, const int seen_syntax = 1; parse_whsp(&ss); mr->mr_syntax_oid = - parse_numericoid(&ss,code,flags); + ldap_int_parse_numericoid(&ss,code,flags); if ( !mr->mr_syntax_oid ) { *errp = ss; ldap_matchingrule_free(mr); @@ -1405,15 +1475,18 @@ void ldap_matchingruleuse_free( LDAPMatchingRuleUse * mru ) { LDAP_FREE(mru->mru_oid); - LDAP_VFREE(mru->mru_names); - LDAP_FREE(mru->mru_desc); - LDAP_VFREE(mru->mru_applies_oids); + if (mru->mru_names) LDAP_VFREE(mru->mru_names); + if (mru->mru_desc) LDAP_FREE(mru->mru_desc); + if (mru->mru_applies_oids) LDAP_VFREE(mru->mru_applies_oids); free_extensions(mru->mru_extensions); LDAP_FREE(mru); } LDAPMatchingRuleUse * -ldap_str2matchingruleuse( const char * s, int * code, const char ** errp, const int flags ) +ldap_str2matchingruleuse( LDAP_CONST char * s, + int * code, + LDAP_CONST char ** errp, + LDAP_CONST int flags ) { int kind; const char * ss = s; @@ -1450,7 +1523,7 @@ ldap_str2matchingruleuse( const char * s, int * code, const char ** errp, const parse_whsp(&ss); savepos = ss; - mru->mru_oid = parse_numericoid(&ss,code,flags); + mru->mru_oid = ldap_int_parse_numericoid(&ss,code,flags); if ( !mru->mru_oid ) { if ( flags & LDAP_SCHEMA_ALLOW_NO_OID ) { /* Backtracking */ @@ -1595,19 +1668,22 @@ void ldap_attributetype_free(LDAPAttributeType * at) { LDAP_FREE(at->at_oid); - LDAP_VFREE(at->at_names); - LDAP_FREE(at->at_desc); - LDAP_FREE(at->at_sup_oid); - LDAP_FREE(at->at_equality_oid); - LDAP_FREE(at->at_ordering_oid); - LDAP_FREE(at->at_substr_oid); - LDAP_FREE(at->at_syntax_oid); + if (at->at_names) LDAP_VFREE(at->at_names); + if (at->at_desc) LDAP_FREE(at->at_desc); + if (at->at_sup_oid) LDAP_FREE(at->at_sup_oid); + if (at->at_equality_oid) LDAP_FREE(at->at_equality_oid); + if (at->at_ordering_oid) LDAP_FREE(at->at_ordering_oid); + if (at->at_substr_oid) LDAP_FREE(at->at_substr_oid); + if (at->at_syntax_oid) LDAP_FREE(at->at_syntax_oid); free_extensions(at->at_extensions); LDAP_FREE(at); } LDAPAttributeType * -ldap_str2attributetype( const char * s, int * code, const char ** errp, const int flags ) +ldap_str2attributetype( LDAP_CONST char * s, + int * code, + LDAP_CONST char ** errp, + LDAP_CONST int flags ) { int kind; const char * ss = s; @@ -1656,10 +1732,11 @@ ldap_str2attributetype( const char * s, int * code, const char ** errp, const in */ parse_whsp(&ss); savepos = ss; - at->at_oid = parse_numericoid(&ss,code,0); + at->at_oid = ldap_int_parse_numericoid(&ss,code,0); if ( !at->at_oid ) { - if ( flags & ( LDAP_SCHEMA_ALLOW_NO_OID - | LDAP_SCHEMA_ALLOW_OID_MACRO ) ) { + if ( ( flags & ( LDAP_SCHEMA_ALLOW_NO_OID + | LDAP_SCHEMA_ALLOW_OID_MACRO ) ) + && (ss == savepos) ) { /* Backtracking */ ss = savepos; kind = get_token(&ss,&sval); @@ -1838,11 +1915,25 @@ ldap_str2attributetype( const char * s, int * code, const char ** errp, const in flags); if ( !at->at_syntax_oid ) { if ( flags & LDAP_SCHEMA_ALLOW_OID_MACRO ) { - int len = ss-savepos; - at->at_syntax_oid = LDAP_MALLOC(len+1); - strncpy(at->at_syntax_oid, savepos, - len); - at->at_syntax_oid[len] = 0; + 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); @@ -1957,17 +2048,20 @@ void ldap_objectclass_free(LDAPObjectClass * oc) { LDAP_FREE(oc->oc_oid); - LDAP_VFREE(oc->oc_names); - LDAP_FREE(oc->oc_desc); - LDAP_VFREE(oc->oc_sup_oids); - LDAP_VFREE(oc->oc_at_oids_must); - LDAP_VFREE(oc->oc_at_oids_may); + if (oc->oc_names) LDAP_VFREE(oc->oc_names); + if (oc->oc_desc) LDAP_FREE(oc->oc_desc); + if (oc->oc_sup_oids) LDAP_VFREE(oc->oc_sup_oids); + if (oc->oc_at_oids_must) LDAP_VFREE(oc->oc_at_oids_must); + if (oc->oc_at_oids_may) LDAP_VFREE(oc->oc_at_oids_may); free_extensions(oc->oc_extensions); LDAP_FREE(oc); } LDAPObjectClass * -ldap_str2objectclass( const char * s, int * code, const char ** errp, const int flags ) +ldap_str2objectclass( LDAP_CONST char * s, + int * code, + LDAP_CONST char ** errp, + LDAP_CONST int flags ) { int kind; const char * ss = s; @@ -2015,9 +2109,9 @@ ldap_str2objectclass( const char * s, int * code, const char ** errp, const int */ parse_whsp(&ss); savepos = ss; - oc->oc_oid = parse_numericoid(&ss,code,0); + oc->oc_oid = ldap_int_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); @@ -2247,7 +2341,7 @@ static char *const err2text[] = { char * ldap_scherr2str(int code) { - if ( code < 0 || code >= (sizeof(err2text)/sizeof(char *)) ) { + if ( code < 0 || code >= (int)(sizeof(err2text)/sizeof(char *)) ) { return "Unknown error"; } else { return err2text[code];