From 6b9b0660c996e5f34e13274c5781f4899d80f84a Mon Sep 17 00:00:00 2001 From: Howard Chu Date: Tue, 18 Sep 2001 11:30:00 +0000 Subject: [PATCH] Fix ITS#1213, OID macro parsing in attributetypes --- include/ldap_schema.h | 3 ++- libraries/libldap/schema.c | 28 ++++++++++++++++++++---- servers/slapd/schemaparse.c | 43 ++++++++++++------------------------- 3 files changed, 40 insertions(+), 34 deletions(-) diff --git a/include/ldap_schema.h b/include/ldap_schema.h index c8722d5251..ecc4c26713 100644 --- a/include/ldap_schema.h +++ b/include/ldap_schema.h @@ -116,7 +116,8 @@ typedef struct ldap_objectclass { #define LDAP_SCHEMA_ALLOW_QUOTED 0x02 /* Allow bogus extra quotes */ #define LDAP_SCHEMA_ALLOW_DESCR 0x04 /* Allow descr instead of OID */ #define LDAP_SCHEMA_ALLOW_DESCR_PREFIX 0x08 /* Allow descr as OID prefix */ -#define LDAP_SCHEMA_ALLOW_ALL 0x0f /* Be very liberal in parsing */ +#define LDAP_SCHEMA_ALLOW_OID_MACRO 0x10 /* Allow OID macros in slapd */ +#define LDAP_SCHEMA_ALLOW_ALL 0x1f /* Be very liberal in parsing */ LDAP_F( LDAP_CONST char * ) ldap_syntax2name LDAP_P(( diff --git a/libraries/libldap/schema.c b/libraries/libldap/schema.c index 094e9e06cc..09fad74a03 100644 --- a/libraries/libldap/schema.c +++ b/libraries/libldap/schema.c @@ -1658,7 +1658,8 @@ 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 ) ) { /* Backtracking */ ss = savepos; kind = get_token(&ss,&sval); @@ -1678,8 +1679,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); @@ -1824,15 +1830,24 @@ 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 ) { + 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; + } else { *errp = ss; ldap_attributetype_free(at); return NULL; + } } parse_whsp(&ss); } else if ( !strcmp(sval,"SINGLE-VALUE") ) { @@ -2018,8 +2033,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); diff --git a/servers/slapd/schemaparse.c b/servers/slapd/schemaparse.c index cd73b41b0a..1570c3d3b8 100644 --- a/servers/slapd/schemaparse.c +++ b/servers/slapd/schemaparse.c @@ -290,32 +290,6 @@ parse_at( 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", @@ -340,9 +314,20 @@ parse_at( } } /* 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 ) { -- 2.39.5