From: Howard Chu Date: Tue, 19 Dec 2023 13:08:14 +0000 (+0000) Subject: ITS#7420 move entry_naming_check earlier in Add X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f5c96f4469b672dbab0e0f8605f1d1790d1369fa;p=thirdparty%2Fopenldap.git ITS#7420 move entry_naming_check earlier in Add Make sure RDN is present in e_attrs before passing entry to overlays --- diff --git a/servers/slapd/add.c b/servers/slapd/add.c index 7934d3e4b4..747537df08 100644 --- a/servers/slapd/add.c +++ b/servers/slapd/add.c @@ -184,6 +184,15 @@ do_add( Operation *op, SlapReply *rs ) goto done; } + /* make sure RDN is present in attrs */ + if ( !is_entry_glue ( op->ora_e )) { + rs->sr_err = entry_naming_check( op->ora_e, get_relax( op ), 1, &rs->sr_text, textbuf, textlen ); + if ( rs->sr_err != LDAP_SUCCESS ) { + send_ldap_result( op, rs ); + goto done; + } + } + freevals = 0; oex = op->o_tmpalloc( sizeof(OpExtraDB), op->o_tmpmemctx ); oex->oe.oe_key = (void *)do_add; diff --git a/servers/slapd/proto-slap.h b/servers/slapd/proto-slap.h index d9dfb85bc8..69ab973378 100644 --- a/servers/slapd/proto-slap.h +++ b/servers/slapd/proto-slap.h @@ -1799,6 +1799,13 @@ LDAP_SLAPD_F( int ) entry_schema_check( const char** text, char *textbuf, size_t textlen ); +LDAP_SLAPD_F( int ) entry_naming_check( + Entry *e, + int manage, + int add_naming, + const char** text, + char *textbuf, size_t textlen ); + LDAP_SLAPD_F( int ) mods_structural_class( Modifications *mods, struct berval *oc, diff --git a/servers/slapd/schema_check.c b/servers/slapd/schema_check.c index 7fa768ffb7..0ea6280e69 100644 --- a/servers/slapd/schema_check.c +++ b/servers/slapd/schema_check.c @@ -29,12 +29,6 @@ static char * oc_check_required( ObjectClass *oc, struct berval *ocname ); -static int entry_naming_check( - Entry *e, - int manage, - int add_naming, - const char** text, - char *textbuf, size_t textlen ); /* * entry_schema_check - check that entry e conforms to the schema required * by its object class(es). @@ -237,8 +231,8 @@ got_soc: } /* naming check */ - if ( !is_entry_glue ( e ) ) { - rc = entry_naming_check( e, manage, add, text, textbuf, textlen ); + if ( !is_entry_glue ( e ) && !add ) { /* add already did this */ + rc = entry_naming_check( e, manage, 0, text, textbuf, textlen ); if( rc != LDAP_SUCCESS ) { goto done; } @@ -772,7 +766,7 @@ int mods_structural_class( } -static int +int entry_naming_check( Entry *e, int manage, diff --git a/servers/slapd/slapcommon.c b/servers/slapd/slapcommon.c index b4766c0c02..d156add364 100644 --- a/servers/slapd/slapcommon.c +++ b/servers/slapd/slapcommon.c @@ -1180,6 +1180,9 @@ slap_tool_entry_check( int rc = entry_schema_check( op, e, manage, 1, NULL, text, textbuf, textlen ); + if( rc == LDAP_SUCCESS ) + rc = entry_naming_check( e, manage, 1, text, textbuf, textlen ); + if( rc != LDAP_SUCCESS ) { fprintf( stderr, "%s: dn=\"%s\" (line=%d): (%d) %s\n", progname, e->e_dn, lineno, rc, *text );