From 84e17044df2ed17c42ccca9805fb3e8cb027aef6 Mon Sep 17 00:00:00 2001 From: Stephen Lombardo Date: Tue, 11 Aug 2009 16:49:37 -0400 Subject: [PATCH] sqlcipher compatibility changes for upstream 3.6.17 --- src/crypto.c | 9 +++++---- src/crypto.h | 7 +++++++ src/pager.c | 23 ++++++++++++----------- test/crypto.test | 7 ++++++- 4 files changed, 30 insertions(+), 16 deletions(-) diff --git a/src/crypto.c b/src/crypto.c index 31bf4f6..532d594 100644 --- a/src/crypto.c +++ b/src/crypto.c @@ -47,6 +47,8 @@ #define CODEC_TRACE(X) #endif +void sqlite3FreeCodecArg(void *pCodecArg); + typedef struct { int derive_key; EVP_CIPHER *evp_cipher; @@ -441,7 +443,7 @@ int sqlite3CodecAttach(sqlite3* db, int nDb, const void *zKey, int nKey) { RAND_pseudo_bytes(ctx->kdf_salt, FILE_HEADER_SZ); } - sqlite3PagerSetCodec(sqlite3BtreePager(pDb->pBt), sqlite3Codec, (void *) ctx); + sqlite3pager_sqlite3PagerSetCodec(sqlite3BtreePager(pDb->pBt), sqlite3Codec, NULL, sqlite3FreeCodecArg, (void *) ctx); codec_set_cipher_name(db, nDb, CIPHER, 0); codec_set_kdf_iter(db, nDb, PBKDF2_ITER, 0); @@ -454,11 +456,10 @@ int sqlite3CodecAttach(sqlite3* db, int nDb, const void *zKey, int nKey) { return SQLITE_ERROR; } -int sqlite3FreeCodecArg(void *pCodecArg) { +void sqlite3FreeCodecArg(void *pCodecArg) { codec_ctx *ctx = (codec_ctx *) pCodecArg; - if(pCodecArg == NULL) return SQLITE_ERROR; + if(pCodecArg == NULL) return; codec_ctx_free(&ctx); // wipe and free allocated memory for the context - return SQLITE_OK; } void sqlite3_activate_see(const char* in) { diff --git a/src/crypto.h b/src/crypto.h index 463848a..d0f7130 100644 --- a/src/crypto.h +++ b/src/crypto.h @@ -51,6 +51,13 @@ void sqlite3pager_get_codec(Pager *pPager, void **ctx); int sqlite3pager_is_mj_pgno(Pager *pPager, Pgno pgno); sqlite3_file *sqlite3Pager_get_fd(Pager *pPager); +void sqlite3pager_sqlite3PagerSetCodec( + Pager *pPager, + void *(*xCodec)(void*,void*,Pgno,int), + void (*xCodecSizeChng)(void*,int,int), + void (*xCodecFree)(void*), + void *pCodec +); #endif #endif diff --git a/src/pager.c b/src/pager.c index 351cb42..3dc68b5 100644 --- a/src/pager.c +++ b/src/pager.c @@ -2645,16 +2645,6 @@ int sqlite3PagerClose(Pager *pPager){ IOTRACE(("CLOSE %p\n", pPager)) sqlite3OsClose(pPager->fd); - /* BEGIN CRYPTO */ -#ifdef SQLITE_HAS_CODEC - extern int sqlite3FreeCodecArg(void *); - if(pPager->pCodecArg) sqlite3FreeCodecArg(pPager->pCodecArg); -#endif - /* END CRYPTO */ - - sqlite3PageFree(pPager->pTmpSpace); - sqlite3PcacheClose(pPager->pPCache); - #ifdef SQLITE_HAS_CODEC if( pPager->xCodecFree ) pPager->xCodecFree(pPager->pCodec); #endif @@ -5339,7 +5329,7 @@ sqlite3_backup **sqlite3PagerBackupPtr(Pager *pPager){ /* BEGIN CRYPTO */ #ifdef SQLITE_HAS_CODEC void sqlite3pager_get_codec(Pager *pPager, void **ctx) { - *ctx = pPager->pCodecArg; + *ctx = pPager->pCodec; } int sqlite3pager_is_mj_pgno(Pager *pPager, Pgno pgno) { @@ -5350,6 +5340,17 @@ sqlite3_file *sqlite3Pager_get_fd(Pager *pPager) { return (isOpen(pPager->fd)) ? pPager->fd : NULL; } +void sqlite3pager_sqlite3PagerSetCodec( + Pager *pPager, + void *(*xCodec)(void*,void*,Pgno,int), + void (*xCodecSizeChng)(void*,int,int), + void (*xCodecFree)(void*), + void *pCodec +){ + sqlite3PagerSetCodec(pPager, xCodec, xCodecSizeChng, xCodecFree, pCodec); +} + + #endif /* END CRYPTO */ diff --git a/test/crypto.test b/test/crypto.test index ecfe07f..f69cb75 100644 --- a/test/crypto.test +++ b/test/crypto.test @@ -220,6 +220,10 @@ do_test codec-1.9 { BEGIN; CREATE TABLE t2(a,b); } db + + for {set i 1} {$i<=3000} {incr i} { + execsql "CREATE TABLE longtablename$i (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa TEXT, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb TEXT);" db + } for {set i 1} {$i<=25000} {incr i} { set r [expr {int(rand()*500000)}] @@ -237,9 +241,10 @@ do_test codec-1.9 { execsql { PRAGMA key = 'testkey'; SELECT count(*) FROM t2; + SELECT count(*) FROM sqlite_master; } db -} {25000} +} {25000 3001} db close file delete -force test.db