static void test_list_compare(void) { Item *list1 = NULL, *list2 = NULL; bool result; result = ListsCompare(list1, list2); assert_true(result); AppendItem(&list1, "abc", NULL); AppendItem(&list1, "def", NULL); result = ListsCompare(list1, list2); assert_false(result); AppendItem(&list2, "def", NULL); AppendItem(&list2, "abc", NULL); result = ListsCompare(list1, list2); assert_true(result); DeleteItemList(list1); DeleteItemList(list2); }
static void SaveSetuid(void) { char filename[CF_BUFSIZE]; snprintf(filename, CF_BUFSIZE, "%s/cfagent.%s.log", GetLogDir(), VSYSNAME.nodename); MapName(filename); PurgeItemList(&VSETUIDLIST, "SETUID/SETGID"); Item *current = RawLoadItemList(filename); if (!ListsCompare(VSETUIDLIST, current)) { RawSaveItemList(VSETUIDLIST, filename, NewLineMode_Unix); } DeleteItemList(VSETUIDLIST); VSETUIDLIST = NULL; }
/** * @brief check whether the lastseen DB is coherent or not * * A DB is coherent mainly if all the entries are valid and if there is * a strict one-to-one correspondance between hosts and key digests * (whether in MD5 or SHA1 format). * * @retval true if the lastseen DB is coherent, false otherwise */ bool IsLastSeenCoherent(void) { DBHandle *db; DBCursor *cursor; bool res = true; if (!OpenDB(&db, dbid_lastseen)) { Log(LOG_LEVEL_ERR, "Unable to open lastseen database"); return false; } if (!NewDBCursor(db, &cursor)) { Log(LOG_LEVEL_ERR, "Unable to create lastseen database cursor"); CloseDB(db); return false; } char *key; void *value; int ksize, vsize; Item *qkeys=NULL; Item *akeys=NULL; Item *kkeys=NULL; Item *ahosts=NULL; Item *khosts=NULL; char val[CF_BUFSIZE]; while (NextDB(cursor, &key, &ksize, &value, &vsize)) { if (key[0] != 'k' && key[0] != 'q' && key[0] != 'a' ) { continue; } if (key[0] == 'q' ) { if (strncmp(key,"qiSHA=",5)==0 || strncmp(key,"qoSHA=",5)==0 || strncmp(key,"qiMD5=",5)==0 || strncmp(key,"qoMD5=",5)==0) { if (IsItemIn(qkeys, key+2)==false) { PrependItem(&qkeys, key+2, NULL); } } } if (key[0] == 'k' ) { if (strncmp(key, "kSHA=", 4)==0 || strncmp(key, "kMD5=", 4)==0) { if (IsItemIn(kkeys, key+1)==false) { PrependItem(&kkeys, key+1, NULL); } if (ReadDB(db, key, &val, vsize)) { if (IsItemIn(khosts, val)==false) { PrependItem(&khosts, val, NULL); } } } } if (key[0] == 'a' ) { if (IsItemIn(ahosts, key+1)==false) { PrependItem(&ahosts, key+1, NULL); } if (ReadDB(db, key, &val, vsize)) { if (IsItemIn(akeys, val)==false) { PrependItem(&akeys, val, NULL); } } } } DeleteDBCursor(cursor); CloseDB(db); if (ListsCompare(ahosts, khosts) == false) { res = false; goto clean; } if (ListsCompare(akeys, kkeys) == false) { res = false; goto clean; } clean: DeleteItemList(qkeys); DeleteItemList(akeys); DeleteItemList(kkeys); DeleteItemList(ahosts); DeleteItemList(khosts); return res; }
static void test_split_string(void) { Item *actual = NULL, *expected = NULL; /* Simple strings. */ actual = SplitString("", ':'); AppendItem(&expected, "", NULL); assert_true(ListsCompare(actual, expected)); DeleteItemList(actual); actual = NULL; DeleteItemList(expected); expected = NULL; test_progress(); actual = SplitString("foo", ':'); AppendItem(&expected, "foo", NULL); assert_true(ListsCompare(actual, expected)); DeleteItemList(actual); actual = NULL; DeleteItemList(expected); expected = NULL; test_progress(); actual = SplitString("foo:bar", ':'); AppendItem(&expected, "foo", NULL); AppendItem(&expected, "bar", NULL); assert_true(ListsCompare(actual, expected)); DeleteItemList(actual); actual = NULL; DeleteItemList(expected); expected = NULL; test_progress(); actual = SplitString(":", ':'); AppendItem(&expected, "", NULL); AppendItem(&expected, "", NULL); assert_true(ListsCompare(actual, expected)); DeleteItemList(actual); actual = NULL; DeleteItemList(expected); expected = NULL; test_progress(); actual = SplitString(":blah", ':'); AppendItem(&expected, "", NULL); AppendItem(&expected, "blah", NULL); assert_true(ListsCompare(actual, expected)); DeleteItemList(actual); actual = NULL; DeleteItemList(expected); expected = NULL; test_progress(); actual = SplitString("blah:", ':'); AppendItem(&expected, "blah", NULL); AppendItem(&expected, "", NULL); assert_true(ListsCompare(actual, expected)); DeleteItemList(actual); actual = NULL; DeleteItemList(expected); expected = NULL; test_progress(); actual = SplitString("blah::blue", ':'); AppendItem(&expected, "blah", NULL); AppendItem(&expected, "", NULL); AppendItem(&expected, "blue", NULL); assert_true(ListsCompare(actual, expected)); DeleteItemList(actual); actual = NULL; DeleteItemList(expected); expected = NULL; test_progress(); /* Escaped separator. */ actual = SplitString("foo\\:bar", ':'); AppendItem(&expected, "foo:bar", NULL); assert_true(ListsCompare(actual, expected)); DeleteItemList(actual); actual = NULL; DeleteItemList(expected); expected = NULL; test_progress(); actual = SplitString("foo:bar\\:baz", ':'); AppendItem(&expected, "foo", NULL); AppendItem(&expected, "bar:baz", NULL); assert_true(ListsCompare(actual, expected)); DeleteItemList(actual); actual = NULL; DeleteItemList(expected); expected = NULL; test_progress(); actual = SplitString("\\:", ':'); AppendItem(&expected, ":", NULL); assert_true(ListsCompare(actual, expected)); DeleteItemList(actual); actual = NULL; DeleteItemList(expected); expected = NULL; test_progress(); actual = SplitString("\\:blah", ':'); AppendItem(&expected, ":blah", NULL); assert_true(ListsCompare(actual, expected)); DeleteItemList(actual); actual = NULL; DeleteItemList(expected); expected = NULL; test_progress(); actual = SplitString("blah\\:", ':'); AppendItem(&expected, "blah:", NULL); assert_true(ListsCompare(actual, expected)); DeleteItemList(actual); actual = NULL; DeleteItemList(expected); expected = NULL; test_progress(); actual = SplitString("blah\\:\\:blue", ':'); AppendItem(&expected, "blah::blue", NULL); assert_true(ListsCompare(actual, expected)); DeleteItemList(actual); actual = NULL; DeleteItemList(expected); expected = NULL; test_progress(); actual = SplitString("blah\\::blue", ':'); AppendItem(&expected, "blah:", NULL); AppendItem(&expected, "blue", NULL); assert_true(ListsCompare(actual, expected)); DeleteItemList(actual); actual = NULL; DeleteItemList(expected); expected = NULL; test_progress(); actual = SplitString("blah:\\:blue", ':'); AppendItem(&expected, "blah", NULL); AppendItem(&expected, ":blue", NULL); assert_true(ListsCompare(actual, expected)); DeleteItemList(actual); actual = NULL; DeleteItemList(expected); expected = NULL; test_progress(); /* Escaped backslash. */ actual = SplitString("\\\\", ':'); AppendItem(&expected, "\\", NULL); assert_true(ListsCompare(actual, expected)); DeleteItemList(actual); actual = NULL; DeleteItemList(expected); expected = NULL; test_progress(); actual = SplitString("blah\\\\blue", ':'); AppendItem(&expected, "blah\\blue", NULL); assert_true(ListsCompare(actual, expected)); DeleteItemList(actual); actual = NULL; DeleteItemList(expected); expected = NULL; test_progress(); actual = SplitString("blah\\\\blue\\:", ':'); AppendItem(&expected, "blah\\blue:", NULL); assert_true(ListsCompare(actual, expected)); DeleteItemList(actual); actual = NULL; DeleteItemList(expected); expected = NULL; test_progress(); actual = SplitString("\\\\:", ':'); AppendItem(&expected, "\\", NULL); AppendItem(&expected, "", NULL); assert_true(ListsCompare(actual, expected)); DeleteItemList(actual); actual = NULL; DeleteItemList(expected); expected = NULL; test_progress(); actual = SplitString(":\\\\", ':'); AppendItem(&expected, "", NULL); AppendItem(&expected, "\\", NULL); assert_true(ListsCompare(actual, expected)); DeleteItemList(actual); actual = NULL; DeleteItemList(expected); expected = NULL; test_progress(); actual = SplitString("\\\\:blah", ':'); AppendItem(&expected, "\\", NULL); AppendItem(&expected, "blah", NULL); assert_true(ListsCompare(actual, expected)); DeleteItemList(actual); actual = NULL; DeleteItemList(expected); expected = NULL; test_progress(); actual = SplitString("\\\\\\:", ':'); AppendItem(&expected, "\\:", NULL); assert_true(ListsCompare(actual, expected)); DeleteItemList(actual); actual = NULL; DeleteItemList(expected); expected = NULL; test_progress(); actual = SplitString("\\\\\\:blah", ':'); AppendItem(&expected, "\\:blah", NULL); assert_true(ListsCompare(actual, expected)); DeleteItemList(actual); actual = NULL; DeleteItemList(expected); expected = NULL; test_progress(); actual = SplitString("blah\\\\:", ':'); AppendItem(&expected, "blah\\", NULL); AppendItem(&expected, "", NULL); assert_true(ListsCompare(actual, expected)); DeleteItemList(actual); actual = NULL; DeleteItemList(expected); expected = NULL; test_progress(); actual = SplitString("\\\\:\\\\", ':'); AppendItem(&expected, "\\", NULL); AppendItem(&expected, "\\", NULL); assert_true(ListsCompare(actual, expected)); DeleteItemList(actual); actual = NULL; DeleteItemList(expected); expected = NULL; test_progress(); actual = SplitString("blah:\\\\:blue", ':'); AppendItem(&expected, "blah", NULL); AppendItem(&expected, "\\", NULL); AppendItem(&expected, "blue", NULL); assert_true(ListsCompare(actual, expected)); DeleteItemList(actual); actual = NULL; DeleteItemList(expected); expected = NULL; test_progress(); actual = SplitString("blah:\\\\\\:blue", ':'); AppendItem(&expected, "blah", NULL); AppendItem(&expected, "\\:blue", NULL); assert_true(ListsCompare(actual, expected)); DeleteItemList(actual); actual = NULL; DeleteItemList(expected); expected = NULL; test_progress(); actual = SplitString("blah\\\\blue", ':'); AppendItem(&expected, "blah\\blue", NULL); assert_true(ListsCompare(actual, expected)); DeleteItemList(actual); actual = NULL; DeleteItemList(expected); expected = NULL; test_progress(); /* End string with backslash, danger of buffer overrun! */ actual = SplitString("blah\\", ':'); AppendItem(&expected, "blah\\", NULL); assert_true(ListsCompare(actual, expected)); DeleteItemList(actual); actual = NULL; DeleteItemList(expected); expected = NULL; test_progress(); actual = SplitString("\\", ':'); AppendItem(&expected, "\\", NULL); assert_true(ListsCompare(actual, expected)); DeleteItemList(actual); actual = NULL; DeleteItemList(expected); expected = NULL; test_progress(); test_progress_end(); }