Просмотр исходного кода

Merge trunk revision 2561:
r2561 | asalkeld | 2009-12-02 15:14:00 -0700 (Wed, 02 Dec 2009) | 2 lines

make sure key_names past from confdb are null terminated.



git-svn-id: http://svn.fedorahosted.org/svn/corosync/branches/flatiron@2616 fd59a12c-fef9-0310-b244-a6a79926bd2f

Steven Dake 16 лет назад
Родитель
Сommit
23e0d3a7b2
3 измененных файлов с 37 добавлено и 4 удалено
  1. 34 4
      exec/objdb.c
  2. 2 0
      lib/confdb.c
  3. 1 0
      lib/sa-confdb.c

+ 34 - 4
exec/objdb.c

@@ -659,8 +659,23 @@ 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;
+	}
+
+	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 +988,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 (

+ 2 - 0
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);
 	}

+ 1 - 0
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,