summaryrefslogtreecommitdiffstats
path: root/collection
diff options
context:
space:
mode:
authorDmitri Pal <dpal@redhat.com>2011-11-17 09:45:06 -0500
committerStephen Gallagher <sgallagh@redhat.com>2011-11-17 12:29:11 -0500
commitf5dbb4ecb9bdf991625d5e48d039a66a765b292c (patch)
tree91f0af0a79648ae74fb5a23ff825bef389f97d5c /collection
parent6e9bffe8cf0070aefa6727bfecab55e1e47db711 (diff)
downloadding-libs2-f5dbb4ecb9bdf991625d5e48d039a66a765b292c.tar.gz
ding-libs2-f5dbb4ecb9bdf991625d5e48d039a66a765b292c.tar.xz
ding-libs2-f5dbb4ecb9bdf991625d5e48d039a66a765b292c.zip
Fixing dereferencing NULL
This is the issue found by Coverity. If the proprty is NULL but type is not there is dereferencing of the NULL veriable in the check.
Diffstat (limited to 'collection')
-rw-r--r--collection/collection.c6
-rw-r--r--collection/collection_ut.c67
2 files changed, 71 insertions, 2 deletions
diff --git a/collection/collection.c b/collection/collection.c
index 4bee949..1b7762a 100644
--- a/collection/collection.c
+++ b/collection/collection.c
@@ -1588,11 +1588,13 @@ static int col_find_item_and_do(struct collection_item *ci,
/* Make sure that there is anything to search */
type &= COL_TYPE_ANY;
- if (((property_to_find == NULL) && (type == 0)) ||
- ((*property_to_find == '\0') && (type == 0))) {
+ if ((type == 0) &&
+ ((property_to_find == NULL) ||
+ ((property_to_find != NULL) && (*property_to_find == '\0')))) {
TRACE_ERROR_NUMBER("No item search criteria specified - returning error!", ENOENT);
return ENOENT;
}
+
/* Prepare data for traversal */
traverse_data = (struct find_name *)malloc(sizeof(struct find_name));
if (traverse_data == NULL) {
diff --git a/collection/collection_ut.c b/collection/collection_ut.c
index e11b0aa..74f1679 100644
--- a/collection/collection_ut.c
+++ b/collection/collection_ut.c
@@ -1630,6 +1630,34 @@ int search_test(void)
found = 0;
error = 0;
+ error = col_is_item_in_collection(level1, NULL, COL_TYPE_INTEGER, COL_TRAVERSE_DEFAULT, &found);
+ if ((error) || (!found)) {
+ col_destroy_collection(level1);
+ col_destroy_collection(level2);
+ col_destroy_collection(level3);
+ col_destroy_collection(level4);
+ printf("Failed to find first int item [level1!level2!level3!level4!id]. Error %d\n", error);
+ return error ? error : ENOENT;
+ }
+ else COLOUT(printf("Expected item is found\n"));
+
+
+ found = 0;
+ error = 0;
+ error = col_is_item_in_collection(level1, "", COL_TYPE_INTEGER, COL_TRAVERSE_DEFAULT, &found);
+ if ((error) || (!found)) {
+ col_destroy_collection(level1);
+ col_destroy_collection(level2);
+ col_destroy_collection(level3);
+ col_destroy_collection(level4);
+ printf("Failed to find first int item [level1!level2!level3!level4!id]. Error %d\n", error);
+ return error ? error : ENOENT;
+ }
+ else COLOUT(printf("Expected item is found\n"));
+
+
+ found = 0;
+ error = 0;
error = col_is_item_in_collection(level1, "level3!level4!id", COL_TYPE_ANY, COL_TRAVERSE_DEFAULT, &found);
if ((error) || (!found)) {
col_destroy_collection(level1);
@@ -1680,6 +1708,45 @@ int search_test(void)
}
else COLOUT(printf("Expected item is found\n"));
+ /* Negative tests */
+ found = 0;
+ error = 0;
+ error = col_is_item_in_collection(level1, NULL, 0, COL_TRAVERSE_DEFAULT, &found);
+ if ((error != ENOENT) || (found)) {
+ col_destroy_collection(level1);
+ col_destroy_collection(level2);
+ col_destroy_collection(level3);
+ col_destroy_collection(level4);
+ if (error) {
+ printf("Unexpected error with NULL & 0 test %d\n", error);
+ }
+ else {
+ printf("Found unexpected item with NULL & 0. Error %d\n", error);
+ error = EINVAL;
+ }
+ return error;
+ }
+ else COLOUT(printf("No item is found as expected.\n"));
+
+ found = 0;
+ error = 0;
+ error = col_is_item_in_collection(level1, "", 0, COL_TRAVERSE_DEFAULT, &found);
+ if ((error != ENOENT) || (found)) {
+ col_destroy_collection(level1);
+ col_destroy_collection(level2);
+ col_destroy_collection(level3);
+ col_destroy_collection(level4);
+ if (error) {
+ printf("Unexpected error with \"\" & 0 tests %d\n", error);
+ }
+ else {
+ printf("Found unexpected item with \"\" & 0. Error %d\n", error);
+ error = EINVAL;
+ }
+ return error;
+ }
+ else COLOUT(printf("No item is found as expected.\n"));
+
col_destroy_collection(level1);
col_destroy_collection(level2);
col_destroy_collection(level3);