X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fschemaparse.c;h=d9f6b6c106e931ea326709ed13ff520ecc979f78;hb=4aa2a2869219880c9a76d9c0ae163a7ff7a51d4e;hp=6f00e93eef2fa297d1cbfed1887fd8d11004caca;hpb=d19419392cdb255db5aa14c6bdf8ff96530bbe6a;p=openldap diff --git a/servers/slapd/schemaparse.c b/servers/slapd/schemaparse.c index 6f00e93eef..d9f6b6c106 100644 --- a/servers/slapd/schemaparse.c +++ b/servers/slapd/schemaparse.c @@ -18,14 +18,16 @@ int global_schemacheck = 1; /* schemacheck on is default */ -static void oc_usage(void) LDAP_GCCATTR((noreturn)); -static void at_usage(void) LDAP_GCCATTR((noreturn)); +static void oc_usage(void); +static void at_usage(void); static char *const err2text[] = { "Success", "Out of memory", "ObjectClass not found", + "ObjectClass inappropriate SUPerior", "AttributeType not found", + "AttributeType inappropriate USAGE", "Duplicate objectClass", "Duplicate attributeType", "Duplicate ldapSyntax", @@ -34,7 +36,9 @@ static char *const err2text[] = { "SYNTAX or SUPerior required", "MatchingRule not found", "Syntax not found", - "Syntax required" + "Syntax required", + "Qualifier not supported", + "Invalid NAME" }; char * @@ -47,6 +51,24 @@ scherr2str(int code) } } +/* check schema descr validity */ +int slap_valid_descr( const char *descr ) +{ + int i=0; + + if( !DESC_LEADCHAR( descr[i] ) ) { + return 0; + } + + while( descr[++i] ) { + if( !DESC_CHAR( descr[i] ) ) { + return 0; + } + } + + return 1; +} + /* OID Macros */ @@ -94,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 ) { @@ -111,6 +133,19 @@ find_oidm(char *oid) } 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, int lineno, @@ -125,7 +160,7 @@ parse_oidm( fprintf( stderr, "%s: line %d: too many arguments\n", fname, lineno ); usage: fprintf( stderr, "\tObjectIdentifier \n"); - exit( EXIT_FAILURE ); + return 1; } oid = find_oidm( argv[1] ); @@ -134,7 +169,7 @@ usage: fprintf( stderr, "\tObjectIdentifier \n"); "%s: line %d: " "ObjectIdentifier \"%s\" previously defined \"%s\"", fname, lineno, argv[1], oid ); - exit( EXIT_FAILURE ); + return 1; } om = (OidMacro *) ch_malloc( sizeof(OidMacro) ); @@ -156,9 +191,11 @@ usage: fprintf( stderr, "\tObjectIdentifier \n"); om->som_oid.bv_len = strlen( om->som_oid.bv_val ); om->som_next = om_list; om_list = om; + + return 0; } -void +int parse_oc( const char *fname, int lineno, @@ -166,7 +203,7 @@ parse_oc( char **argv ) { - LDAP_OBJECT_CLASS *oc; + LDAPObjectClass *oc; int code; const char *err; char *oid = NULL; @@ -176,31 +213,41 @@ parse_oc( fprintf( stderr, "%s: line %d: %s before %s\n", fname, lineno, ldap_scherr2str(code), err ); oc_usage(); + 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); - exit( EXIT_FAILURE ); - } - 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", fname, lineno, scherr2str(code), err); - exit( EXIT_FAILURE ); + return 1; } + ldap_memfree(oc); + return 0; } static void @@ -218,7 +265,6 @@ oc_usage( void ) " [ \"MUST\" oids ] ; AttributeTypes\n" " [ \"MAY\" oids ] ; AttributeTypes\n" " whsp \")\"\n" ); - exit( EXIT_FAILURE ); } @@ -246,10 +292,9 @@ at_usage( void ) " ; distributedOperation\n" " ; dSAOperation\n" " whsp \")\"\n"); - exit( EXIT_FAILURE ); } -void +int parse_at( const char *fname, int lineno, @@ -257,69 +302,63 @@ parse_at( char **argv ) { - LDAP_ATTRIBUTE_TYPE *at; + LDAPAttributeType *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++) - { - if (!strcasecmp(argv[3], "syntax") && - !OID_LEADCHAR(*argv[4])) - { - 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]); - exit( EXIT_FAILURE ); - } - 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", fname, lineno, ldap_scherr2str(code), err ); 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); - exit( EXIT_FAILURE ); - } - 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 ) { fprintf( stderr, "%s: line %d: %s: \"%s\"\n", fname, lineno, scherr2str(code), err); - exit( EXIT_FAILURE ); + return 1; } ldap_memfree(at); + return 0; }