You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@celix.apache.org by pn...@apache.org on 2018/02/13 12:27:31 UTC

celix git commit: Some small refactoring for filters and fixes a memory leak

Repository: celix
Updated Branches:
  refs/heads/develop f4cd98387 -> 7d87b0847


Some small refactoring for filters and fixes a memory leak


Project: http://git-wip-us.apache.org/repos/asf/celix/repo
Commit: http://git-wip-us.apache.org/repos/asf/celix/commit/7d87b084
Tree: http://git-wip-us.apache.org/repos/asf/celix/tree/7d87b084
Diff: http://git-wip-us.apache.org/repos/asf/celix/diff/7d87b084

Branch: refs/heads/develop
Commit: 7d87b08474caa20eaa68b39113ae9e85f1231204
Parents: f4cd983
Author: Pepijn Noltes <pe...@gmail.com>
Authored: Tue Feb 13 13:27:20 2018 +0100
Committer: Pepijn Noltes <pe...@gmail.com>
Committed: Tue Feb 13 13:27:20 2018 +0100

----------------------------------------------------------------------
 framework/include/filter.h             |  6 +-
 framework/private/test/filter_test.cpp | 85 ++++++++++++++---------------
 framework/src/filter.c                 | 32 ++++++-----
 3 files changed, 61 insertions(+), 62 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/celix/blob/7d87b084/framework/include/filter.h
----------------------------------------------------------------------
diff --git a/framework/include/filter.h b/framework/include/filter.h
index 179ef53..b636c74 100644
--- a/framework/include/filter.h
+++ b/framework/include/filter.h
@@ -59,9 +59,9 @@ typedef struct celix_filter_struct celix_filter_t;
 
 struct celix_filter_struct {
     celix_filter_operand_t operand;
-    char *attribute; //NULL for operands AND, OR ot NOT
-    char *value; //NULL for operands AND, OR or NOT NOT
-    char *filterStr;
+    const char *attribute; //NULL for operands AND, OR ot NOT
+    const char *value; //NULL for operands AND, OR or NOT NOT
+    const char *filterStr;
 
     //type is celix_filter_t* for AND, OR and NOT operator and char* for SUBSTRING
     //for other operands childern is NULL

http://git-wip-us.apache.org/repos/asf/celix/blob/7d87b084/framework/private/test/filter_test.cpp
----------------------------------------------------------------------
diff --git a/framework/private/test/filter_test.cpp b/framework/private/test/filter_test.cpp
index b802923..df7255e 100644
--- a/framework/private/test/filter_test.cpp
+++ b/framework/private/test/filter_test.cpp
@@ -81,39 +81,36 @@ TEST(filter, create_destroy){
 }
 
 TEST(filter, create_fail_missing_opening_brackets){
-	char * filter_str;
 	celix_filter_t * get_filter;
 
+    mock().ignoreOtherCalls();
+
 	//test missing opening brackets in main filter
-	mock().expectNCalls(2, "framework_log");
-	filter_str = my_strdup("&(test_attr1=attr1)(|(test_attr2=attr2)(test_attr3=attr3))");
-	get_filter = filter_create(filter_str);
+	//mock().expectNCalls(2, "framework_log");
+	const char *filter_str1 = "&(test_attr1=attr1)(|(test_attr2=attr2)(test_attr3=attr3))";
+	get_filter = filter_create(filter_str1);
 	POINTERS_EQUAL(NULL, get_filter);
-	free(filter_str);
 	mock().checkExpectations();
 
 	//test missing opening brackets in AND comparator
-	mock().expectNCalls(3, "framework_log");
-	filter_str = my_strdup("(&test_attr1=attr1|(test_attr2=attr2)(test_attr3=attr3))");
-	get_filter = filter_create(filter_str);
+	//mock().expectNCalls(3, "framework_log");
+	const char *filter_str2 = "(&test_attr1=attr1|(test_attr2=attr2)(test_attr3=attr3))";
+	get_filter = filter_create(filter_str2);
 	POINTERS_EQUAL(NULL, get_filter);
-	free(filter_str);
 	mock().checkExpectations();
 
 	//test missing opening brackets in AND comparator
-	mock().expectNCalls(4, "framework_log");
-	filter_str = my_strdup("(&(test_attr1=attr1)(|test_attr2=attr2(test_attr3=attr3))");
-	get_filter = filter_create(filter_str);
+	//mock().expectNCalls(4, "framework_log");
+	const char *filter_str3 = "(&(test_attr1=attr1)(|test_attr2=attr2(test_attr3=attr3))";
+	get_filter = filter_create(filter_str3);
 	POINTERS_EQUAL(NULL, get_filter);
-	free(filter_str);
 	mock().checkExpectations();
 
 	//test missing opening brackets in NOT comparator
-	mock().expectNCalls(4, "framework_log");
-	filter_str = my_strdup("(&(test_attr1=attr1)(!test_attr2=attr2)");
-	get_filter = filter_create(filter_str);
+	//mock().expectNCalls(4, "framework_log");
+	const char *filter_str4 = "(&(test_attr1=attr1)(!test_attr2=attr2)";
+	get_filter = filter_create(filter_str4);
 	POINTERS_EQUAL(NULL, get_filter);
-	free(filter_str);
 	mock().checkExpectations();
 }
 
@@ -140,8 +137,11 @@ TEST(filter, create_fail_missing_closing_brackets){
 TEST(filter, create_fail_invalid_closing_brackets){
 	char * filter_str;
 	celix_filter_t * get_filter;
+
+    mock().ignoreOtherCalls();
+
 	//test missing closing brackets in substring
-	mock().expectNCalls(6, "framework_log");
+	//mock().expectNCalls(6, "framework_log");
 	filter_str = my_strdup("(&(test_attr1=attr1)(|(test_attr2=attr2)(test_attr3=at(tr3)))");
 	get_filter = filter_create(filter_str);
 	POINTERS_EQUAL(NULL, get_filter);
@@ -149,7 +149,7 @@ TEST(filter, create_fail_invalid_closing_brackets){
 	mock().checkExpectations();
 
 	//test missing closing brackets in value
-	mock().expectNCalls(5, "framework_log");
+	//mock().expectNCalls(5, "framework_log");
 	filter_str = my_strdup("(&(test_attr1=attr1)(|(test_attr2=attr2)(test_attr3>=att(r3)))");
 	get_filter = filter_create(filter_str);
 	POINTERS_EQUAL(NULL, get_filter);
@@ -158,66 +158,61 @@ TEST(filter, create_fail_invalid_closing_brackets){
 }
 
 TEST(filter, create_misc){
-	char * filter_str;
 	celix_filter_t * get_filter;
+
+	mock().ignoreOtherCalls();
+
 	//test trailing chars
-	mock().expectOneCall("framework_log");
-	filter_str = my_strdup("(&(test_attr1=attr1)(|(test_attr2=attr2)(test_attr3=attr3))) oh no! trailing chars");
-	get_filter = filter_create(filter_str);
+	//mock().expectOneCall("framework_log");
+	const char *filter_str1 = "(&(test_attr1=attr1)(|(test_attr2=attr2)(test_attr3=attr3))) oh no! trailing chars";
+	get_filter = filter_create(filter_str1);
 	POINTERS_EQUAL(NULL, get_filter);
-	free(filter_str);
 	mock().checkExpectations();
 
 	//test half APPROX operator (should be "~=", instead is "~")
-	mock().expectNCalls(5, "framework_log");
-	filter_str = my_strdup("(&(test_attr1=attr1)(|(test_attr2=attr2)(test_attr3~attr3)))");
-	get_filter = filter_create(filter_str);
+	//mock().expectNCalls(5, "framework_log");
+	const char* filter_str2 = "(&(test_attr1=attr1)(|(test_attr2=attr2)(test_attr3~attr3)))";
+	get_filter = filter_create(filter_str2);
 	POINTERS_EQUAL(NULL, get_filter);
-	free(filter_str);
 	mock().checkExpectations();
 
 	//test PRESENT operator with trailing chars (should just register as substrings: "*" and "attr3")
-	filter_str = my_strdup("(test_attr3=*attr3)");
-	get_filter = filter_create(filter_str);
+	const char *filter_str3 = "(test_attr3=*attr3)";
+	get_filter = filter_create(filter_str3);
 	CHECK(get_filter != NULL);
 	LONGS_EQUAL(CELIX_FILTER_OPERAND_SUBSTRING, get_filter->operand)
 	LONGS_EQUAL(2, arrayList_size((array_list_pt) get_filter->children));
 	filter_destroy(get_filter);
-	free(filter_str);
 	mock().checkExpectations();
 
 	//test parsing a attribute of 0 length
-	mock().expectNCalls(3, "framework_log");
-	filter_str = my_strdup("(>=attr3)");
-	get_filter = filter_create(filter_str);
+	//mock().expectNCalls(3, "framework_log");
+	const char* filter_str4 = "(>=attr3)";
+	get_filter = filter_create(filter_str4);
 	POINTERS_EQUAL(NULL, get_filter);
-	free(filter_str);
 	mock().checkExpectations();
 
 	//test parsing a value of 0 length
-	mock().expectOneCall("framework_log");
-	filter_str = my_strdup("(test_attr3>=)");
-	get_filter = filter_create(filter_str);
+	//mock().expectOneCall("framework_log");
+	const char* filter_str5 = "(test_attr3>=)";
+	get_filter = filter_create(filter_str5);
 	POINTERS_EQUAL(NULL, get_filter);
-	free(filter_str);
 	mock().checkExpectations();
 
 	//test parsing a value with a escaped closing bracket "\)"
-	filter_str = my_strdup("(test_attr3>=strWith\\)inIt)");
-	get_filter = filter_create(filter_str);
+	const char* filter_str6 = "(test_attr3>=strWith\\)inIt)";
+	get_filter = filter_create(filter_str6);
 	CHECK(get_filter != NULL);
 	STRCMP_EQUAL("strWith)inIt", (char*)get_filter->value);
 	filter_destroy(get_filter);
-	free(filter_str);
 	mock().checkExpectations();
 
 	//test parsing a substring with a escaped closing bracket "\)"
-	filter_str = my_strdup("(test_attr3=strWith\\)inIt)");
-	get_filter = filter_create(filter_str);
+	const char *filter_str7 = "(test_attr3=strWith\\)inIt)";
+	get_filter = filter_create(filter_str7);
 	CHECK(get_filter != NULL);
 	STRCMP_EQUAL("strWith)inIt", (char*)get_filter->value);
 	filter_destroy(get_filter);
-	free(filter_str);
 	mock().checkExpectations();
 }
 

http://git-wip-us.apache.org/repos/asf/celix/blob/7d87b084/framework/src/filter.c
----------------------------------------------------------------------
diff --git a/framework/src/filter.c b/framework/src/filter.c
index 7077b08..019dff6 100644
--- a/framework/src/filter.c
+++ b/framework/src/filter.c
@@ -28,6 +28,7 @@
 #include <stdlib.h>
 #include <ctype.h>
 #include <assert.h>
+#include <utils.h>
 
 #include "celix_log.h"
 #include "filter.h"
@@ -53,18 +54,14 @@ static void filter_skipWhiteSpace(char * filterString, int * pos) {
 
 celix_filter_t * filter_create(const char* filterString) {
 	celix_filter_t * filter = NULL;
-	char* filterStr = strndup(filterString, 1024*1024);
+	char* filterStr = string_ndup(filterString, 1024*1024);
 	int pos = 0;
 	filter = filter_parseFilter(filterStr, &pos);
-	if (pos != strlen(filterStr)) {
+	if (filter != NULL && pos != strlen(filterStr)) {
 		fw_log(logger, OSGI_FRAMEWORK_LOG_ERROR,  "Error: Extraneous trailing characters.");
-        free(filterStr);
 		filter_destroy(filter);
-		return NULL;
-	}
-	if (filter != NULL) {
-        filter->filterStr = filterStr;
-
+		filter = NULL;
+	} else if (filter != NULL) {
         if (filter->operand != CELIX_FILTER_OPERAND_OR && filter->operand != CELIX_FILTER_OPERAND_AND &&
             filter->operand != CELIX_FILTER_OPERAND_NOT && filter->operand != CELIX_FILTER_OPERAND_SUBSTRING &&
             filter->operand != CELIX_FILTER_OPERAND_PRESENT) {
@@ -75,6 +72,12 @@ celix_filter_t * filter_create(const char* filterString) {
         }
     }
 
+	if (filter == NULL) {
+		free(filterStr);
+	} else {
+		filter->filterStr = filterStr;
+	}
+
 	return filter;
 }
 
@@ -83,15 +86,16 @@ void filter_destroy(celix_filter_t * filter) {
 		if(filter->children != NULL){
 			if (filter->operand == CELIX_FILTER_OPERAND_SUBSTRING) {
 				int size = arrayList_size(filter->children);
-				for (; size > 0; --size) {
-					char* operand = (char*) arrayList_remove(filter->children, 0);
+				int i = 0;
+				for (i = 0; i < size; i++) {
+					char *operand = arrayList_get(filter->children, i);
 					free(operand);
 				}
 				arrayList_destroy(filter->children);
 				filter->children = NULL;
 			} else if (filter->operand == CELIX_FILTER_OPERAND_OR || filter->operand == CELIX_FILTER_OPERAND_AND || filter->operand == CELIX_FILTER_OPERAND_NOT) {
                 int size = arrayList_size(filter->children);
-                unsigned int i = 0;
+                int i = 0;
                 for (i = 0; i < size; i++) {
                     celix_filter_t *f = arrayList_get(filter->children, i);
                     filter_destroy(f);
@@ -102,12 +106,12 @@ void filter_destroy(celix_filter_t * filter) {
                 fw_log(logger, OSGI_FRAMEWORK_LOG_ERROR,  "Error: Corrupt filter. childern has a value, but not an expected operand");
             }
 		}
-        free(filter->value);
+        free((char*)filter->value);
         filter->value = NULL;
-		free(filter->attribute);
+		free((char*)filter->attribute);
 		filter->attribute = NULL;
 		free(filter);
-        free(filter->filterStr);
+        free((char*)filter->filterStr);
         filter->filterStr = NULL;
 	}
 }