[389-devel] Please review (revised): Plugin Default Config Entry

Noriko Hosoi nhosoi at redhat.com
Fri Aug 28 15:18:01 UTC 2009


On 08/28/2009 07:25 AM, Rich Megginson wrote:
> Noriko Hosoi wrote:
>> Thanks a lot, Rich!  I revised my proposal based upon your 
>> suggestions.  Some comments are in-line...
>> --noriko
>>
>> On 08/26/2009 09:13 AM, Rich Megginson wrote:
>> [...]
>>> About this code:
>>>     if (new_attrs)
>>>     {
>>> -        *attrs = new_attrs;
>>> +        charray_merge_nodup(attrs, new_attrs, 0);
>>> +        slapi_ch_free((void **)&new_attrs);
>>>     }
>>>
>>> the 0 flag to charray_merge_nodup() means "do not copy" - so the 
>>> strings in new_attrs will be moved to attrs, if they are not 
>>> duplicates.  If they are duplicates, they will not be moved - how 
>>> will they be freed?  There's no way for the caller of 
>>> charray_merge_nodup to know which strings were moved and which were 
>>> not (except by comparing pointers in attrs with new_attrs).
>> I wanted to avoid malloc/free as much as possible, but it looks I 
>> cannot... :(  Changing it as follows:
>>     if (new_attrs)
>>     {
>>         charray_merge_nodup(attrs, new_attrs, 1);
>>         slapi_ch_array_free(new_attrs);
>>     }
>>
>>>
>>> +            int i;
>>> +            const char *val = slapi_value_get_string(sval);
>>> +            for (i = slapi_attr_first_value(attr, &sval);
>>>
>>> I don't think you should be calling slapi_value_get_string() here 
>>> since sval is not initialized yet.
>> Thanks for finding it out!  My copy & paste error... :(  Changing it 
>> as follows:
>>             int i;
>>             const char *val = NULL;
>>             for (i = slapi_attr_first_value(attr, &sval);
>>>
>>> I think slapi_set_plugin_default_config() should always to a 
>>> modify/add, and just ignore "type or value exists" errors.  Or 
>>> support single valued attributes only.  Or allow the user to specify 
>>> to add or replace in the case of a multi-valued attribute. 
>> I was thinking the value is preferably single, but I wanted to 
>> support multiple values if set (e.g., by manually adding dse.ldif as 
>> you mentioned).  That made the code uglier.  I changed 
>> slapi_set_plugin_default_config simply adds the given "attr: value" 
>> pair to the plugin default config entry instead of replacing the 
>> existing pair(s) with it.
>>> What if the user modifies the list directly over LDAP or by editing 
>>> dse.ldif?  An internal call to set the value will wipe out their 
>>> settings. 
>>
>>> Also, there is a reference to frational attr in the 
>>> slapi_set_plugin_default_config() code.
>> Thanks!  I removed it... :p
>>>
>>> I think slapi_set_plugin_default_config() will leak the pblock used 
>>> for the initial search if rc != LDAP_SUCCESS or entries is NULL or 
>>> empty.
>> I think it's taken care here....  Valgrind shows no leak in 
>> slapi_set_plugin_default_config in both cases entries exist or don't 
>> exist.
>> 2911     } else { /* cn=plugin default config does not exist. Let's 
>> add it. */
>> 2912         LDAPMod *mods[3];
>> 2913         LDAPMod mod[2];
>> 2914         const char *objectclass[3];
>> 2915         char *attrlist[2];
>> 2916   *2917         slapi_free_search_results_internal(&pb);
>> 2918         pblock_done(&pb);*
>>
>>>
>>> slapi_get_plugin_default_config() - since you are assuming that the 
>>> values of the requested attribute are all null terminated strings 
>>> (since you are using slapi_value_get_string()), you could just use 
>>> slapi_entry_attr_get_charray() to get all of the values as a char **.
>> Thanks!  This is what I needed...
>>>
>>> Why does slapi_set_plugin_default_config() take a char * argument 
>>> i.e. setting an attribute with a single string value, but 
>>> slapi_get_plugin_default_config() returns multiple values from a 
>>> single attribute?
>>>
>>> I'm not sure what the code in usn_start() is doing.  Is 
>>> nsds5ReplicatedAttributeList multi-valued?  If so, each char * in 
>>> char **old_frac_attrs will be a full attribute list description 
>>> "(objectclass=*) $ EXCLUDE ...".  Then I'm not sure what the code 
>>> that adds the entryusn attribute to the default excluded list is 
>>> doing - will it add entryusn to only the first value of 
>>> nsds5ReplicatedAttributeList?  And wipe out the other values?  I 
>>> think that's what will happen, since there is a break in the for 
>>> loop if token == NULL - it will skip old_frac_attrs[1] etc.  Also 
>>> the call to charray_add - the token argument is not a malloced 
>>> string, so that will cause problems when slapi_ch_array_free() is 
>>> called.
>>>
>> I cleaned up the code.  It just adds the attribute value as follows.
>>     /* add nsds5ReplicatedAttributeList: (objectclass=*) $ EXCLUDE 
>> entryusn
>>      * to cn=plugin default config,cn=config */
>>     rc = slapi_set_plugin_default_config("nsds5ReplicatedAttributeList",
>>                                          "(objectclass=*) $ EXCLUDE 
>> entryusn");
>>
>> Sorry about the previous code I wiped out.  I wanted to do this...
>> Let's assume we found exisiting nsds5ReplicatedAttributeList lines:
>>   nsds5ReplicatedAttributeList: (objectclass=*) $ EXCLUDE type0
>>   nsds5ReplicatedAttributeList: (objectclass=*) $ EXCLUDE type1 type 2
>> I wanted to convert them in to one line:
>>   nsds5ReplicatedAttributeList: (objectclass=*) $ EXCLUDE type0 type1 
>> type 2 entryusn
>>
>> Instead, I changed to just add nsds5ReplicatedAttributeList: 
>> (objectclass=*) $ EXCLUDE entryusn to the entry.  So, it'll end up 
>> like this:
>>   nsds5ReplicatedAttributeList: (objectclass=*) $ EXCLUDE type0
>>   nsds5ReplicatedAttributeList: (objectclass=*) $ EXCLUDE type1 type 2
>>   nsds5ReplicatedAttributeList: (objectclass=*) $ EXCLUDE entryusn
> Ok - will the replication code be able to handle multiple values of 
> nsds5ReplicatedAttributeList?
Yes, it's already in the proposal...   (and is tested :) )
--noriko
>>
>> ------------------------------------------------------------------------
>>
>> -- 
>> 389-devel mailing list
>> 389-devel at redhat.com
>> https://www.redhat.com/mailman/listinfo/fedora-directory-devel
>
> ------------------------------------------------------------------------
>
> --
> 389-devel mailing list
> 389-devel at redhat.com
> https://www.redhat.com/mailman/listinfo/fedora-directory-devel
>    

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://listman.redhat.com/archives/fedora-directory-devel/attachments/20090828/4850eab9/attachment.htm>


More information about the Fedora-directory-devel mailing list