| #include "sqliteInt.h" |
| #include "unity.h" |
| #include <string.h> |
| #include <stdlib.h> |
|
|
| |
| extern void test_renameTokenCheckAll(Parse *pParse, const void *pPtr); |
|
|
| static void initParse(sqlite3 **ppDb, Parse *pParse){ |
| sqlite3 *db = 0; |
| int rc = sqlite3_open(":memory:", &db); |
| TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc); |
| memset(pParse, 0, sizeof(*pParse)); |
| pParse->db = db; |
| db->pParse = pParse; |
| pParse->nErr = 0; |
| db->mallocFailed = 0; |
| pParse->pRename = 0; |
| *ppDb = db; |
| } |
|
|
| static u8* allocByte(u8 val){ |
| u8 *p = (u8*)sqlite3_malloc(1); |
| TEST_ASSERT_NOT_NULL(p); |
| *p = val; |
| return p; |
| } |
|
|
| static RenameToken* allocToken(void *pPtr, RenameToken *pNext){ |
| RenameToken *t = (RenameToken*)sqlite3_malloc(sizeof(RenameToken)); |
| TEST_ASSERT_NOT_NULL(t); |
| memset(t, 0, sizeof(*t)); |
| t->p = pPtr; |
| t->pNext = pNext; |
| return t; |
| } |
|
|
| static void freeTokenList(RenameToken *p){ |
| while(p){ |
| RenameToken *n = p->pNext; |
| sqlite3_free(p); |
| p = n; |
| } |
| } |
|
|
| void setUp(void) { |
| |
| } |
|
|
| void tearDown(void) { |
| |
| } |
|
|
| |
| void test_renameTokenCheckAll_empty_list(void){ |
| sqlite3 *db = 0; |
| Parse parse; |
| initParse(&db, &parse); |
|
|
| |
| u8 *other = allocByte(0xAB); |
|
|
| test_renameTokenCheckAll(&parse, other); |
|
|
| sqlite3_free(other); |
| sqlite3_close(db); |
| } |
|
|
| |
| void test_renameTokenCheckAll_multi_node_valid_pointers(void){ |
| sqlite3 *db = 0; |
| Parse parse; |
| initParse(&db, &parse); |
|
|
| u8 *a = allocByte(0x11); |
| u8 *b = allocByte(0x22); |
| u8 *c = allocByte(0x33); |
| u8 *other = allocByte(0x44); |
|
|
| RenameToken *t3 = allocToken(c, NULL); |
| RenameToken *t2 = allocToken(b, t3); |
| RenameToken *t1 = allocToken(a, t2); |
| parse.pRename = t1; |
|
|
| test_renameTokenCheckAll(&parse, other); |
|
|
| sqlite3_free(other); |
| sqlite3_free(a); |
| sqlite3_free(b); |
| sqlite3_free(c); |
| freeTokenList(t1); |
| sqlite3_close(db); |
| } |
|
|
| |
| void test_renameTokenCheckAll_mixed_null_and_nonnull_pointers(void){ |
| sqlite3 *db = 0; |
| Parse parse; |
| initParse(&db, &parse); |
|
|
| u8 *x = allocByte(0x5A); |
| u8 *y = allocByte(0xC3); |
| u8 *other = allocByte(0x7E); |
|
|
| RenameToken *t4 = allocToken(y, NULL); |
| RenameToken *t3 = allocToken(NULL, t4); |
| RenameToken *t2 = allocToken(x, t3); |
| RenameToken *t1 = allocToken(NULL, t2); |
| parse.pRename = t1; |
|
|
| test_renameTokenCheckAll(&parse, other); |
|
|
| sqlite3_free(other); |
| sqlite3_free(x); |
| sqlite3_free(y); |
| freeTokenList(t1); |
| sqlite3_close(db); |
| } |
|
|
| |
| |
| void test_renameTokenCheckAll_nErr_nonzero_avoids_dereference(void){ |
| sqlite3 *db = 0; |
| Parse parse; |
| initParse(&db, &parse); |
|
|
| |
| u8 *dead = allocByte(0xAA); |
| sqlite3_free(dead); |
|
|
| RenameToken *t1 = allocToken(dead, NULL); |
| parse.pRename = t1; |
|
|
| |
| parse.nErr = 1; |
| parse.db->mallocFailed = 1; |
|
|
| |
| test_renameTokenCheckAll(&parse, dead); |
|
|
| freeTokenList(t1); |
| sqlite3_close(db); |
| } |
|
|
| int main(void) { |
| UNITY_BEGIN(); |
| RUN_TEST(test_renameTokenCheckAll_empty_list); |
| RUN_TEST(test_renameTokenCheckAll_multi_node_valid_pointers); |
| RUN_TEST(test_renameTokenCheckAll_mixed_null_and_nonnull_pointers); |
| RUN_TEST(test_renameTokenCheckAll_nErr_nonzero_avoids_dereference); |
| return UNITY_END(); |
| } |