>>> 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