X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Foidm.c;h=b62f2c67882087799d9a331e1db94dd1e60b3ae7;hb=e841247c9086053d774d66e4fbb058d0ead706b2;hp=2fe6cc552c7f5db2ebd3e94dbbf2aa62abebcc40;hpb=f0f7324e0e75efc909696f5a3a5a0dfabc271e44;p=openldap diff --git a/servers/slapd/oidm.c b/servers/slapd/oidm.c index 2fe6cc552c..b62f2c6788 100644 --- a/servers/slapd/oidm.c +++ b/servers/slapd/oidm.c @@ -2,7 +2,7 @@ /* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * - * Copyright 1998-2006 The OpenLDAP Foundation. + * Copyright 1998-2009 The OpenLDAP Foundation. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -26,10 +26,10 @@ #include "lutil.h" #include "config.h" -static LDAP_STAILQ_HEAD(OidMacroList, slap_oid_macro) om_list +static LDAP_STAILQ_HEAD(OidMacroList, OidMacro) om_list = LDAP_STAILQ_HEAD_INITIALIZER(om_list); -static OidMacro *om_sys_tail; +OidMacro *om_sys_tail; /* Replace an OID Macro invocation with its full numeric OID. * If the macro is used with "macroname:suffix" append ".suffix" @@ -99,27 +99,44 @@ parse_oidm( int user, OidMacro **rom) { - char *oid; + char *oid, *oidv; OidMacro *om = NULL, *prev = NULL; struct berval bv; + oidv = oidm_find( c->argv[2] ); + if( !oidv ) { + snprintf( c->cr_msg, sizeof( c->cr_msg ), + "%s: OID %s not recognized", + c->argv[0], c->argv[2] ); + Debug( LDAP_DEBUG_CONFIG|LDAP_DEBUG_NONE, + "%s %s\n", c->log, c->cr_msg, 0 ); + return 1; + } + oid = oidm_find( c->argv[1] ); if( oid != NULL ) { - snprintf( c->msg, sizeof( c->msg ), + int rc; + snprintf( c->cr_msg, sizeof( c->cr_msg ), "%s: \"%s\" previously defined \"%s\"", c->argv[0], c->argv[1], oid ); Debug( LDAP_DEBUG_CONFIG|LDAP_DEBUG_NONE, - "%s %s\n", c->log, c->msg, 0 ); + "%s %s\n", c->log, c->cr_msg, 0 ); + /* Allow duplicate if the definition is identical */ + rc = strcmp( oid, oidv ) != 0; SLAP_FREE( oid ); - return 1; + if ( oidv != c->argv[2] ) + SLAP_FREE( oidv ); + return rc; } om = (OidMacro *) SLAP_CALLOC( sizeof(OidMacro), 1 ); if( om == NULL ) { - snprintf( c->msg, sizeof( c->msg ), + snprintf( c->cr_msg, sizeof( c->cr_msg ), "%s: SLAP_CALLOC failed", c->argv[0] ); Debug( LDAP_DEBUG_ANY, - "%s %s\n", c->log, c->msg, 0 ); + "%s %s\n", c->log, c->cr_msg, 0 ); + if ( oidv != c->argv[2] ) + SLAP_FREE( oidv ); return 1; } @@ -129,17 +146,7 @@ parse_oidm( ber_bvarray_add( &om->som_names, &bv ); ber_str2bv( c->argv[2], 0, 1, &bv ); ber_bvarray_add( &om->som_subs, &bv ); - om->som_oid.bv_val = oidm_find( c->argv[2] ); - - if (!om->som_oid.bv_val) { - snprintf( c->msg, sizeof( c->msg ), - "%s: OID %s not recognized", - c->argv[0], c->argv[2] ); - Debug( LDAP_DEBUG_CONFIG|LDAP_DEBUG_NONE, - "%s %s\n", c->log, c->msg, 0 ); - SLAP_FREE( om ); - return 1; - } + om->som_oid.bv_val = oidv; if (om->som_oid.bv_val == c->argv[2]) { om->som_oid.bv_val = ch_strdup( c->argv[2] ); @@ -149,6 +156,7 @@ parse_oidm( if ( !user ) { om->som_flags |= SLAP_OM_HARDCODE; prev = om_sys_tail; + om_sys_tail = om; } if ( prev ) { @@ -173,7 +181,7 @@ void oidm_unparse( BerVarray *res, OidMacro *start, OidMacro *end, int sys ) /* count the result size */ i = 0; for ( om=start; om; om=LDAP_STAILQ_NEXT(om, som_next)) { - if ( sys && !(om->som_flags & SLAP_OM_HARDCODE)) continue; + if ( sys && !(om->som_flags & SLAP_OM_HARDCODE)) break; for ( j=0; !BER_BVISNULL(&om->som_names[j]); j++ ); i += j; if ( om == end ) break; @@ -189,7 +197,7 @@ void oidm_unparse( BerVarray *res, OidMacro *start, OidMacro *end, int sys ) ibuf[0] = '\0'; } for ( i=0,om=start; om; om=LDAP_STAILQ_NEXT(om, som_next)) { - if ( sys && !(om->som_flags & SLAP_OM_HARDCODE)) continue; + if ( sys && !(om->som_flags & SLAP_OM_HARDCODE)) break; for ( j=0; !BER_BVISNULL(&om->som_names[j]); i++,j++ ) { if ( !sys ) { idx.bv_len = sprintf(idx.bv_val, "{%d}", i );