diff options
author | Nathan Kinder <nkinder@redhat.com> | 2009-02-26 21:41:15 +0000 |
---|---|---|
committer | Nathan Kinder <nkinder@redhat.com> | 2009-02-26 21:41:15 +0000 |
commit | 4124d830d825c7588029b6644afe8cbac0db9ad8 (patch) | |
tree | 7bb3b9820318cf262a12c157a9b42ad935c94059 | |
parent | db2a098b97aaca733395822990cb7574e96e9135 (diff) | |
download | ds-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.c | 46 |
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; + } } } |