summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNathan Kinder <nkinder@redhat.com>2009-02-26 21:41:15 +0000
committerNathan Kinder <nkinder@redhat.com>2009-02-26 21:41:15 +0000
commit4124d830d825c7588029b6644afe8cbac0db9ad8 (patch)
tree7bb3b9820318cf262a12c157a9b42ad935c94059
parentdb2a098b97aaca733395822990cb7574e96e9135 (diff)
downloadds-4124d830d825c7588029b6644afe8cbac0db9ad8.tar.gz
ds-4124d830d825c7588029b6644afe8cbac0db9ad8.tar.xz
ds-4124d830d825c7588029b6644afe8cbac0db9ad8.zip
Resolves: bug 487574
Bug Description: A crash occurs in the DNA plug-in when you delete an existing value of a managed attribute. Reviewed by: rmeggins (thanks!) Files: see diff Branch: HEAD Fix Description: The DNA code was always expecting a value to be present when processing a modify operation. The delete and replace modify operations can be issues with no values. These operations were an oversight in the DNA code. The fix adds cases to handle delete and replace modify operations. For a replace, we check if we are replacing all values with nothing, and generate a new value from the range. If we're processing a delete with no values specified, we also generate a new value. If the delete has values specified, we check to see if the operation leaves any values in the existing entry. If no existing values would remain after the operation, we generate a new value. Platforms tested: F9 Flag Day: no Doc impact: no
-rw-r--r--ldap/servers/plugins/dna/dna.c46
1 files changed, 36 insertions, 10 deletions
diff --git a/ldap/servers/plugins/dna/dna.c b/ldap/servers/plugins/dna/dna.c
index eb01358d..3b5ba3ed 100644
--- a/ldap/servers/plugins/dna/dna.c
+++ b/ldap/servers/plugins/dna/dna.c
@@ -2628,18 +2628,44 @@ static int dna_pre_op(Slapi_PBlock * pb, int modtype)
if (slapi_attr_types_equivalent(type,
config_entry->type)) {
- struct berval *bv =
- slapi_mod_get_first_value(smod);
- int len = strlen(config_entry->generate);
-
-
- if (len == bv->bv_len) {
- if (!slapi_UTF8NCASECMP(bv->bv_val,
- config_entry->generate,
- len))
+ /* If all values are being deleted, we need to
+ * generate a new value. */
+ if (SLAPI_IS_MOD_DELETE(slapi_mod_get_operation(smod))) {
+ int numvals = slapi_mod_get_num_values(smod);
+ if (numvals == 0) {
generate = 1;
- break;
+ } else {
+ Slapi_Attr *attr = NULL;
+ int e_numvals = 0;
+
+ slapi_entry_attr_find(e, type, &attr);
+ if (attr) {
+ slapi_attr_get_numvalues(attr, &e_numvals);
+ if (numvals >= e_numvals) {
+ generate = 1;
+ }
+ }
+ }
+ } else {
+ /* This is either adding or replacing a value */
+ struct berval *bv = slapi_mod_get_first_value(smod);
+
+ /* If we have a value, see if it's the magic value. */
+ if (bv) {
+ int len = strlen(config_entry->generate);
+ if (len == bv->bv_len) {
+ if (!slapi_UTF8NCASECMP(bv->bv_val,
+ config_entry->generate,
+ len))
+ generate = 1;
+ break;
+ }
+ } else {
+ /* This is a replace with no new values, so we need
+ * to generate a new value. */
+ generate = 1;
+ }
}
}