Skip to content

Commit 8a43a62

Browse files
Fix sqlcipher_export & cipher_migrate when tracing API used
1 parent 8f52dde commit 8a43a62

3 files changed

Lines changed: 37 additions & 0 deletions

File tree

src/crypto.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -610,6 +610,7 @@ void sqlcipher_exportFunc(sqlite3_context *context, int argc, sqlite3_value **ar
610610
int saved_flags; /* Saved value of the db->flags */
611611
int saved_nChange; /* Saved value of db->nChange */
612612
int saved_nTotalChange; /* Saved value of db->nTotalChange */
613+
u8 saved_mTrace; /* Saved value of db->mTrace */
613614
int (*saved_xTrace)(u32,void*,void*,void*); /* Saved db->xTrace */
614615
int rc = SQLITE_OK; /* Return code from service routines */
615616
char *zSql = NULL; /* SQL statements */
@@ -619,9 +620,11 @@ void sqlcipher_exportFunc(sqlite3_context *context, int argc, sqlite3_value **ar
619620
saved_nChange = db->nChange;
620621
saved_nTotalChange = db->nTotalChange;
621622
saved_xTrace = db->xTrace;
623+
saved_mTrace = db->mTrace;
622624
db->flags |= SQLITE_WriteSchema | SQLITE_IgnoreChecks | SQLITE_PreferBuiltin;
623625
db->flags &= ~(SQLITE_ForeignKeys | SQLITE_ReverseOrder);
624626
db->xTrace = 0;
627+
db->mTrace = 0;
625628

626629
/* Query the schema of the main database. Create a mirror schema
627630
** in the temporary database.
@@ -707,6 +710,7 @@ void sqlcipher_exportFunc(sqlite3_context *context, int argc, sqlite3_value **ar
707710
db->nChange = saved_nChange;
708711
db->nTotalChange = saved_nTotalChange;
709712
db->xTrace = saved_xTrace;
713+
db->mTrace = saved_mTrace;
710714

711715
sqlite3_free(zSql);
712716

src/crypto_impl.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1026,6 +1026,7 @@ int sqlcipher_codec_ctx_migrate(codec_ctx *ctx) {
10261026
int saved_flags;
10271027
int saved_nChange;
10281028
int saved_nTotalChange;
1029+
u8 saved_mTrace;
10291030
int (*saved_xTrace)(u32,void*,void*,void*); /* Saved db->xTrace */
10301031
Db *pDb = 0;
10311032
sqlite3 *db = ctx->pBt->db;
@@ -1130,9 +1131,11 @@ int sqlcipher_codec_ctx_migrate(codec_ctx *ctx) {
11301131
saved_nChange = db->nChange;
11311132
saved_nTotalChange = db->nTotalChange;
11321133
saved_xTrace = db->xTrace;
1134+
saved_mTrace = db->mTrace;
11331135
db->flags |= SQLITE_WriteSchema | SQLITE_IgnoreChecks | SQLITE_PreferBuiltin;
11341136
db->flags &= ~(SQLITE_ForeignKeys | SQLITE_ReverseOrder);
11351137
db->xTrace = 0;
1138+
db->mTrace = 0;
11361139

11371140
pDest = db->aDb[0].pBt;
11381141
pDb = &(db->aDb[db->nDb-1]);
@@ -1164,6 +1167,7 @@ int sqlcipher_codec_ctx_migrate(codec_ctx *ctx) {
11641167
db->nChange = saved_nChange;
11651168
db->nTotalChange = saved_nTotalChange;
11661169
db->xTrace = saved_xTrace;
1170+
db->mTrace = saved_mTrace;
11671171
db->autoCommit = 1;
11681172
sqlite3BtreeClose(pDb->pBt);
11691173
pDb->pBt = 0;

test/crypto.test

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,11 @@ proc cmpFilesChunked {file1 file2 {chunksize 16384}} {
103103
return 0
104104
}
105105

106+
proc trace_proc sql {
107+
global TRACE_OUT
108+
lappend TRACE_OUT [string trim $sql]
109+
}
110+
106111
# The database is initially empty.
107112
# set an hex key create some basic data
108113
# create table and insert operations should work
@@ -2318,5 +2323,29 @@ if_built_with_openssl wont-write-database-with-invalid-cipher-2 {
23182323
db close
23192324
file delete -force test.db
23202325

2326+
do_test verify-cipher-export-with-trace-configured {
2327+
sqlite_orig db plain.db
2328+
execsql {
2329+
CREATE TABLE t1(a,b);
2330+
INSERT INTO t1(a,b) VALUES(1,2);
2331+
}
2332+
set TRACE_OUT {}
2333+
db trace trace_proc
2334+
set stmt [sqlite3_prepare db {ATTACH DATABASE 'encrypted.db' AS encrypted KEY 'encrypted';} -1 TAIL]
2335+
sqlite3_step $stmt
2336+
sqlite3_finalize $stmt
2337+
set stmt [sqlite3_prepare db {SELECT sqlcipher_export('encrypted');} -1 TAIL]
2338+
sqlite3_step $stmt
2339+
sqlite3_finalize $stmt
2340+
set stmt [sqlite3_prepare db {DETACH DATABASE encrypted;} -1 TAIL]
2341+
sqlite3_step $stmt
2342+
sqlite3_finalize $stmt
2343+
set TRACE_OUT
2344+
} {{ATTACH DATABASE 'encrypted.db' AS encrypted KEY 'encrypted';} {SELECT sqlcipher_export('encrypted');} {DETACH DATABASE encrypted;}}
2345+
set TRACE_OUT {}
2346+
db close
2347+
file delete -force plain.db
2348+
file delete -force encrypted.db
2349+
23212350
sqlite3_test_control_pending_byte $old_pending_byte
23222351
finish_test

0 commit comments

Comments
 (0)