>>> On 12/1/2009 at 08:52 PM, in message <[email protected]>,
"Fabio M.
Di Nitto" <[email protected]> wrote: 
> Not sure if this is the same problem, but it appears that trunk/ is
> leaking memory. sometimes 4 bytes, sometimes 128.
> 
> flatiron doesn*t show this problem at all, so i suspect it*s one of
the
> changes in the objdb.
> 
> Fabio
> 

Hi

This patch includes some key_iter() null terminator fixes.

I have run this on Fabio's machine and it looks good (Fabio can
you confirm?).

patch attached.

Regards
Angus

diff --git a/exec/objdb.c b/exec/objdb.c
index 3334460..9512f49 100644
--- a/exec/objdb.c
+++ b/exec/objdb.c
@@ -659,8 +659,25 @@ static int object_key_create (
        const void *value,
        size_t value_len)
 {
-       return object_key_create_typed (object_handle, key_name,
+       char *key_name_terminated = NULL;
+       char *key_name_str = (char*)key_name;
+       int ret;
+
+       if (key_name_str[key_len-1] != '\0') {
+               key_name_terminated = malloc (key_len + 1);
+               memcpy (key_name_terminated, key_name, key_len);
+               key_name_terminated[key_len] = '\0';
+               key_name_str = key_name_terminated;
+       }
+
+       printf("%s() key:%s len:%d\n",__func__,key_name_str, 
strlen(key_name_str));
+
+       ret = object_key_create_typed (object_handle, key_name_str,
                                        value, value_len, OBJDB_VALUETYPE_ANY);
+       if (key_name_terminated) {
+               free (key_name_terminated);
+       }
+       return ret;
 }
 
 static int _clear_object(struct object_instance *instance)
@@ -973,9 +990,24 @@ static int object_key_get (
        size_t *value_len)
 {
        objdb_value_types_t t;
-       return object_key_get_typed(object_handle,
-                                                         key_name,
-                                                         value, value_len, &t);
+       int ret;
+       char *key_name_str = (char*)key_name;
+       char *key_name_terminated = NULL;
+
+       if (key_name_str[key_len-1] != '\0') {
+               key_name_terminated = malloc (key_len + 1);
+               memcpy (key_name_terminated, key_name, key_len);
+               key_name_terminated[key_len] = '\0';
+               key_name_str = key_name_terminated;
+       }
+
+       ret = object_key_get_typed(object_handle,
+               key_name_str,
+               value, value_len, &t);
+       if (key_name_terminated) {
+               free (key_name_terminated);
+       }
+       return ret;
 }
 
 static int object_key_increment (
diff --git a/lib/confdb.c b/lib/confdb.c
index 8e43f0a..1d8bd8b 100644
--- a/lib/confdb.c
+++ b/lib/confdb.c
@@ -1449,8 +1449,10 @@ cs_error_t confdb_key_iter (
 
        error = res_lib_confdb_key_iter.header.error;
        if (error == CS_OK) {
+               char* key_name_str = (char*)key_name;
                *key_name_len = res_lib_confdb_key_iter.key_name.length;
                memcpy(key_name, res_lib_confdb_key_iter.key_name.value, 
*key_name_len);
+               key_name_str[res_lib_confdb_key_iter.key_name.length] = '\0';
                *value_len = res_lib_confdb_key_iter.value.length;
                memcpy(value, res_lib_confdb_key_iter.value.value, *value_len);
        }
diff --git a/lib/sa-confdb.c b/lib/sa-confdb.c
index f44dc34..712df9d 100644
--- a/lib/sa-confdb.c
+++ b/lib/sa-confdb.c
@@ -424,6 +424,7 @@ int confdb_sa_key_iter_typed (
 
        if (!res) {
                memcpy(key_name, kname, key_name_len);
+               key_name[key_name_len] = '\0';
                memcpy(value, kvalue, *value_len);
 
                objdb->object_key_get_typed(parent_object_handle,
_______________________________________________
Openais mailing list
[email protected]
https://lists.linux-foundation.org/mailman/listinfo/openais

Reply via email to