X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fschemaparse.c;h=d9f6b6c106e931ea326709ed13ff520ecc979f78;hb=4aa2a2869219880c9a76d9c0ae163a7ff7a51d4e;hp=cd73b41b0a69b70128263a1f11e88766249ae7a9;hpb=67cf14466ee76083bb72919e5970700f9b639f51;p=openldap diff --git a/servers/slapd/schemaparse.c b/servers/slapd/schemaparse.c index cd73b41b0a..d9f6b6c106 100644 --- a/servers/slapd/schemaparse.c +++ b/servers/slapd/schemaparse.c @@ -116,8 +116,8 @@ find_oidm(char *oid) if( pos ) { int suflen = strlen(oid + pos); - char *new = ch_calloc(1, - om->som_oid.bv_len + suflen + 1); + char *new = ch_malloc( om->som_oid.bv_len + + suflen + 1); strcpy(new, om->som_oid.bv_val); if( suflen ) { @@ -132,6 +132,19 @@ find_oidm(char *oid) return NULL; } +void +oidm_destroy() +{ + OidMacro *om, *n; + + for (om = om_list; om; om = n) { + n = om->som_next; + charray_free(om->som_names); + free(om->som_oid.bv_val); + free(om); + } +} + int parse_oidm( const char *fname, @@ -203,24 +216,29 @@ parse_oc( return 1; } - if ( oc->oc_oid ) { - if ( !OID_LEADCHAR( oc->oc_oid[0] )) { - /* Expand OID macros */ - oid = find_oidm( oc->oc_oid ); - if ( !oid ) { - fprintf(stderr, - "%s: line %d: OID %s not recognized\n", - fname, lineno, oc->oc_oid); - return 1; - } - if ( oid != oc->oc_oid ) { - ldap_memfree( oc->oc_oid ); - oc->oc_oid = oid; - } + if ( oc->oc_oid == NULL ) { + fprintf( stderr, + "%s: line %d: objectclass has no OID\n", + fname, lineno ); + oc_usage(); + return 1; + } + + if ( !OID_LEADCHAR( oc->oc_oid[0] )) { + /* Expand OID macros */ + oid = find_oidm( oc->oc_oid ); + if ( !oid ) { + fprintf( stderr, + "%s: line %d: OID %s not recognized\n", + fname, lineno, oc->oc_oid); + return 1; + } + if ( oid != oc->oc_oid ) { + ldap_memfree( oc->oc_oid ); + oc->oc_oid = oid; } } - /* oc->oc_oid == NULL will be an error someday */ code = oc_add(oc,&err); if ( code ) { fprintf( stderr, "%s: line %d: %s: \"%s\"\n", @@ -288,34 +306,7 @@ parse_at( int code; const char *err; char *oid = NULL; - char *soid = NULL; - - /* Kludge for OIDmacros for syntaxes. If the syntax field starts - * nonnumeric, look for and expand a macro. The macro's place in - * the input line will be replaced with a field of '0's to keep - * ldap_str2attributetype happy. The actual oid will be swapped - * into place afterwards. - */ - for (; argv[3]; argv++) - { - /* Allow numeric OIDs to be wrapped in single quotes */ - if (!strcasecmp(argv[3], "syntax") && argv[4] != NULL && - !OID_LEADCHAR(argv[4][argv[4][0] == '\'' ? 1 : 0])) - { - int slen; - Syntax *syn; - syn = syn_find_desc(argv[4], &slen); - if (!syn) - { - fprintf(stderr, "%s: line %d: OID %s not found\n", - fname, lineno, argv[4]); - return 1; - } - memset(strstr(line, argv[4]), '0', slen); - soid = ch_strdup(syn->ssyn_syn.syn_oid ); - break; - } - } + at = ldap_str2attributetype(line,&code,&err,LDAP_SCHEMA_ALLOW_ALL); if ( !at ) { fprintf( stderr, "%s: line %d: %s before %s\n", @@ -323,26 +314,44 @@ parse_at( at_usage(); return 1; } - if ( at->at_oid ) { - if ( !OID_LEADCHAR( at->at_oid[0] )) { - /* Expand OID macros */ - oid = find_oidm( at->at_oid ); - if ( !oid ) { - fprintf(stderr, - "%s: line %d: OID %s not recognized\n", - fname, lineno, at->at_oid); - return 1; - } - if ( oid != at->at_oid ) { - ldap_memfree( at->at_oid ); - at->at_oid = oid; - } + + if ( at->at_oid == NULL ) { + fprintf( stderr, + "%s: line %d: attributeType has no OID\n", + fname, lineno ); + at_usage(); + return 1; + } + + if ( !OID_LEADCHAR( at->at_oid[0] )) { + /* Expand OID macros */ + oid = find_oidm( at->at_oid ); + if ( !oid ) { + fprintf( stderr, + "%s: line %d: OID %s not recognized\n", + fname, lineno, at->at_oid); + return 1; + } + if ( oid != at->at_oid ) { + ldap_memfree( at->at_oid ); + at->at_oid = oid; } } - /* at->at_oid == NULL will be an error someday */ - if (soid) { - ldap_memfree(at->at_syntax_oid); - at->at_syntax_oid = soid; + + if ( at->at_syntax_oid && !OID_LEADCHAR( at->at_syntax_oid[0] )) { + /* Expand OID macros */ + oid = find_oidm( at->at_syntax_oid ); + if ( !oid ) { + fprintf(stderr, + "%s: line %d: OID %s not recognized\n", + fname, lineno, at->at_syntax_oid); + return 1; + } + if ( oid != at->at_syntax_oid ) { + ldap_memfree( at->at_syntax_oid ); + at->at_syntax_oid = oid; + } + } code = at_add(at,&err); if ( code ) {