File 0005-openldap-its9753.patch of Package openldap2
From 739081f217c9cdb2636d99250092e8d7b30bdd94 Mon Sep 17 00:00:00 2001
From: Howard Chu <hyc@openldap.org>
Date: Tue, 23 Nov 2021 17:10:29 +0000
Subject: ITS#9753 back-mdb: Fix index updating for replace ops
diff --git a/servers/slapd/back-mdb/modify.c b/servers/slapd/back-mdb/modify.c
index 5b301408d..87b54a472 100644
--- a/servers/slapd/back-mdb/modify.c
+++ b/servers/slapd/back-mdb/modify.c
@@ -27,11 +27,14 @@ static struct berval scbva[] = {
BER_BVNULL
};
+#define CHECK_ADD 1
+#define CHECK_DEL 2
+
static void
mdb_modify_idxflags(
Operation *op,
AttributeDescription *desc,
- int got_delete,
+ int ixcheck,
Attribute *newattrs,
Attribute *oldattrs )
{
@@ -42,7 +45,7 @@ mdb_modify_idxflags(
* but not in case of NOOP... */
ai = mdb_index_mask( op->o_bd, desc, &ix_at );
if ( ai ) {
- if ( got_delete ) {
+ if ( ixcheck & CHECK_DEL ) {
Attribute *ap;
struct berval ix2;
@@ -65,7 +68,8 @@ mdb_modify_idxflags(
}
}
- } else {
+ }
+ if ( ixcheck & CHECK_ADD ) {
Attribute *ap;
ap = attr_find( newattrs, desc );
@@ -91,7 +95,7 @@ int mdb_modify_internal(
Attribute *ap, *aold, *anew;
int glue_attr_delete = 0;
int softop, chkpresent;
- int got_delete;
+ int ixcheck;
int a_flags;
MDB_cursor *mvc = NULL;
@@ -140,7 +144,7 @@ int mdb_modify_internal(
for ( ml = modlist; ml != NULL; ml = ml->sml_next ) {
mod = &ml->sml_mod;
- got_delete = 0;
+ ixcheck = 0;
aold = attr_find( e->e_attrs, mod->sm_desc );
if (aold)
@@ -207,6 +211,7 @@ mval_fail: strncpy( textbuf, mdb_strerror( err ), textlen );
if ( err )
goto mval_fail;
}
+ ixcheck |= CHECK_ADD;
}
break;
@@ -237,7 +242,7 @@ do_del:
err, *text );
} else {
if (softop != 2)
- got_delete = 1;
+ ixcheck |= CHECK_DEL;
/* check for big multivalued attrs */
if (a_flags & SLAP_ATTR_BIG_MULTI) {
Attribute a_dummy;
@@ -285,7 +290,9 @@ do_del:
err, *text );
} else {
unsigned hi;
- got_delete = 1;
+ ixcheck = CHECK_DEL;
+ if ( mod->sm_numvals )
+ ixcheck |= CHECK_ADD;
if (a_flags & SLAP_ATTR_BIG_MULTI) {
Attribute a_dummy;
if (!mvc) {
@@ -331,7 +338,7 @@ do_del:
"mdb_modify_internal: %d %s\n",
err, *text );
} else {
- got_delete = 1;
+ ixcheck = CHECK_ADD|CHECK_DEL;
}
break;
@@ -403,7 +410,7 @@ do_del:
/* check if modified attribute was indexed
* but not in case of NOOP... */
if ( !op->o_noop ) {
- mdb_modify_idxflags( op, mod->sm_desc, got_delete, e->e_attrs, save_attrs );
+ mdb_modify_idxflags( op, mod->sm_desc, ixcheck, e->e_attrs, save_attrs );
}
}
@@ -434,7 +441,7 @@ do_del:
assert( ap->a_desc == slap_schema.si_ad_structuralObjectClass );
if ( !op->o_noop ) {
mdb_modify_idxflags( op, slap_schema.si_ad_structuralObjectClass,
- 1, e->e_attrs, save_attrs );
+ CHECK_ADD|CHECK_DEL, e->e_attrs, save_attrs );
}
}