Пример #1
0
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);
}
Пример #2
0
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;
}
Пример #3
0
/**
 * @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;
}
Пример #4
0
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();
}