X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fschemaparse.c;h=d9f6b6c106e931ea326709ed13ff520ecc979f78;hb=4aa2a2869219880c9a76d9c0ae163a7ff7a51d4e;hp=37b4b488429fc5c260028520fd50b86b05924572;hpb=10730ca226e8ddd0d69b2bc2da6818298cc8528e;p=openldap diff --git a/servers/slapd/schemaparse.c b/servers/slapd/schemaparse.c index 37b4b48842..d9f6b6c106 100644 --- a/servers/slapd/schemaparse.c +++ b/servers/slapd/schemaparse.c @@ -18,8 +18,8 @@ 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", @@ -36,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 * @@ -49,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 */ @@ -96,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 ) { @@ -113,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, @@ -127,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] ); @@ -136,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) ); @@ -158,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, @@ -178,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 @@ -220,7 +265,6 @@ oc_usage( void ) " [ \"MUST\" oids ] ; AttributeTypes\n" " [ \"MAY\" oids ] ; AttributeTypes\n" " whsp \")\"\n" ); - exit( EXIT_FAILURE ); } @@ -248,10 +292,9 @@ at_usage( void ) " ; distributedOperation\n" " ; dSAOperation\n" " whsp \")\"\n"); - exit( EXIT_FAILURE ); } -void +int parse_at( const char *fname, int lineno, @@ -263,65 +306,59 @@ 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++) - { - 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; }