@@ -56,9 +56,15 @@ static volatile int mem_security_initialized = 0;
5656static volatile int mem_security_activated = 0 ;
5757static volatile unsigned int sqlcipher_activate_count = 0 ;
5858static volatile sqlite3_mem_methods default_mem_methods ;
59- static sqlite3_mutex * sqlcipher_provider_mutex = NULL ;
6059static sqlcipher_provider * default_provider = NULL ;
6160
61+ static sqlite3_mutex * sqlcipher_static_mutex [SQLCIPHER_MUTEX_COUNT ];
62+
63+ sqlite3_mutex * sqlcipher_mutex (int mutex ) {
64+ if (mutex < 0 || mutex >= SQLCIPHER_MUTEX_COUNT ) return NULL ;
65+ return sqlcipher_static_mutex [mutex ];
66+ }
67+
6268static int sqlcipher_mem_init (void * pAppData ) {
6369 return default_mem_methods .xInit (pAppData );
6470}
@@ -116,9 +122,9 @@ void sqlcipher_init_memmethods() {
116122}
117123
118124int sqlcipher_register_provider (sqlcipher_provider * p ) {
119- CODEC_TRACE_MUTEX ("sqlcipher_register_provider: entering sqlcipher provider mutex %p \n" , sqlcipher_provider_mutex );
120- sqlite3_mutex_enter (sqlcipher_provider_mutex );
121- CODEC_TRACE_MUTEX ("sqlcipher_register_provider: entered sqlcipher provider mutex %p\n" , sqlcipher_provider_mutex );
125+ CODEC_TRACE_MUTEX ("sqlcipher_register_provider: entering SQLCIPHER_MUTEX_PROVIDER \n" );
126+ sqlite3_mutex_enter (sqlcipher_mutex ( SQLCIPHER_MUTEX_PROVIDER ) );
127+ CODEC_TRACE_MUTEX ("sqlcipher_register_provider: entered SQLCIPHER_MUTEX_PROVIDER" \ n );
122128
123129 if (default_provider != NULL && default_provider != p ) {
124130 /* only free the current registerd provider if it has been initialized
@@ -127,9 +133,9 @@ int sqlcipher_register_provider(sqlcipher_provider *p) {
127133 sqlcipher_free (default_provider , sizeof (sqlcipher_provider ));
128134 }
129135 default_provider = p ;
130- CODEC_TRACE_MUTEX ("sqlcipher_register_provider: leaving sqlcipher provider mutex %p \n" , sqlcipher_provider_mutex );
131- sqlite3_mutex_leave (sqlcipher_provider_mutex );
132- CODEC_TRACE_MUTEX ("sqlcipher_register_provider: left sqlcipher provider mutex %p \n" , sqlcipher_provider_mutex );
136+ CODEC_TRACE_MUTEX ("sqlcipher_register_provider: leaving SQLCIPHER_MUTEX_PROVIDER \n" );
137+ sqlite3_mutex_leave (sqlcipher_mutex ( SQLCIPHER_MUTEX_PROVIDER ) );
138+ CODEC_TRACE_MUTEX ("sqlcipher_register_provider: left SQLCIPHER_MUTEX_PROVIDER \n" );
133139
134140 return SQLITE_OK ;
135141}
@@ -146,11 +152,12 @@ void sqlcipher_activate() {
146152 sqlite3_mutex_enter (sqlite3_mutex_alloc (SQLITE_MUTEX_STATIC_MASTER ));
147153 CODEC_TRACE_MUTEX ("sqlcipher_activate: entered static master mutex\n" );
148154
149- if (sqlcipher_provider_mutex == NULL ) {
150- /* allocate a new mutex to guard access to the provider */
151- CODEC_TRACE_MUTEX ("sqlcipher_activate: allocating sqlcipher provider mutex\n" );
152- sqlcipher_provider_mutex = sqlite3_mutex_alloc (SQLITE_MUTEX_FAST );
153- CODEC_TRACE_MUTEX ("sqlcipher_activate: allocated sqlcipher provider mutex %p\n" , sqlcipher_provider_mutex );
155+ /* allocate new mutexes */
156+ if (sqlcipher_activate_count == 0 ) {
157+ int i ;
158+ for (i = 0 ; i < SQLCIPHER_MUTEX_COUNT ; i ++ ) {
159+ sqlcipher_static_mutex [i ] = sqlite3_mutex_alloc (SQLITE_MUTEX_FAST );
160+ }
154161 }
155162
156163 /* check to see if there is a provider registered at this point
@@ -196,30 +203,32 @@ void sqlcipher_deactivate() {
196203 sqlcipher_activate_count -- ;
197204 /* if no connections are using sqlcipher, cleanup globals */
198205 if (sqlcipher_activate_count < 1 ) {
199- CODEC_TRACE_MUTEX ("sqlcipher_deactivate: entering sqlcipher provider mutex %p\n" , sqlcipher_provider_mutex );
200- sqlite3_mutex_enter (sqlcipher_provider_mutex );
201- CODEC_TRACE_MUTEX ("sqlcipher_deactivate: entered sqlcipher provider mutex %p\n" , sqlcipher_provider_mutex );
206+
207+ CODEC_TRACE_MUTEX ("sqlcipher_deactivate: entering SQLCIPHER_MUTEX_PROVIDER\n" );
208+ sqlite3_mutex_enter (sqlcipher_mutex (SQLCIPHER_MUTEX_PROVIDER ));
209+ CODEC_TRACE_MUTEX ("sqlcipher_deactivate: entered SQLCIPHER_MUTEX_PROVIDER\n" );
202210
203211 if (default_provider != NULL ) {
204212 sqlcipher_free (default_provider , sizeof (sqlcipher_provider ));
205213 default_provider = NULL ;
206214 }
207215
208- CODEC_TRACE_MUTEX ("sqlcipher_deactivate: leaving sqlcipher provider mutex %p\n" , sqlcipher_provider_mutex );
209- sqlite3_mutex_leave (sqlcipher_provider_mutex );
210- CODEC_TRACE_MUTEX ("sqlcipher_deactivate: left sqlcipher provider mutex %p\n" , sqlcipher_provider_mutex );
211-
212- /* last connection closed, free provider mutex*/
213- CODEC_TRACE_MUTEX ("sqlcipher_deactivate: freeing sqlcipher provider mutex %p\n" , sqlcipher_provider_mutex );
214- sqlite3_mutex_free (sqlcipher_provider_mutex );
215- CODEC_TRACE_MUTEX ("sqlcipher_deactivate: freed sqlcipher provider mutex %p\n" , sqlcipher_provider_mutex );
216-
217- sqlcipher_provider_mutex = NULL ;
216+ CODEC_TRACE_MUTEX ("sqlcipher_deactivate: leaving SQLCIPHER_MUTEX_PROVIDER\n" );
217+ sqlite3_mutex_leave (sqlcipher_mutex (SQLCIPHER_MUTEX_PROVIDER ));
218+ CODEC_TRACE_MUTEX ("sqlcipher_deactivate: left SQLCIPHER_MUTEX_PROVIDER\n" );
218219
219- sqlcipher_activate_count = 0 ; /* reset activation count */
220220#ifdef SQLCIPHER_EXT
221221 sqlcipher_ext_provider_destroy ();
222222#endif
223+
224+ /* last connection closed, free mutexes */
225+ if (sqlcipher_activate_count == 0 ) {
226+ int i ;
227+ for (i = 0 ; i < SQLCIPHER_MUTEX_COUNT ; i ++ ) {
228+ sqlite3_mutex_free (sqlcipher_static_mutex [i ]);
229+ }
230+ }
231+ sqlcipher_activate_count = 0 ; /* reset activation count */
223232 }
224233
225234 CODEC_TRACE_MUTEX ("sqlcipher_deactivate: leaving static master mutex\n" );
@@ -845,15 +854,15 @@ int sqlcipher_codec_ctx_init(codec_ctx **iCtx, Db *pDb, Pager *pPager, const voi
845854 if (ctx -> provider == NULL ) return SQLITE_NOMEM ;
846855
847856 /* make a copy of the provider to be used for the duration of the context */
848- CODEC_TRACE_MUTEX ("sqlcipher_codec_ctx_init: entering sqlcipher provider mutex %p \n" , sqlcipher_provider_mutex );
849- sqlite3_mutex_enter (sqlcipher_provider_mutex );
850- CODEC_TRACE_MUTEX ("sqlcipher_codec_ctx_init: entered sqlcipher provider mutex %p \n" , sqlcipher_provider_mutex );
857+ CODEC_TRACE_MUTEX ("sqlcipher_codec_ctx_init: entering SQLCIPHER_MUTEX_PROVIDER \n" );
858+ sqlite3_mutex_enter (sqlcipher_mutex ( SQLCIPHER_MUTEX_PROVIDER ) );
859+ CODEC_TRACE_MUTEX ("sqlcipher_codec_ctx_init: entered SQLCIPHER_MUTEX_PROVIDER \n" );
851860
852861 memcpy (ctx -> provider , default_provider , sizeof (sqlcipher_provider ));
853862
854- CODEC_TRACE_MUTEX ("sqlcipher_codec_ctx_init: leaving sqlcipher provider mutex %p \n" , sqlcipher_provider_mutex );
855- sqlite3_mutex_leave (sqlcipher_provider_mutex );
856- CODEC_TRACE_MUTEX ("sqlcipher_codec_ctx_init: left sqlcipher provider mutex %p \n" , sqlcipher_provider_mutex );
863+ CODEC_TRACE_MUTEX ("sqlcipher_codec_ctx_init: leaving SQLCIPHER_MUTEX_PROVIDER \n" );
864+ sqlite3_mutex_leave (sqlcipher_mutex ( SQLCIPHER_MUTEX_PROVIDER ) );
865+ CODEC_TRACE_MUTEX ("sqlcipher_codec_ctx_init: left SQLCIPHER_MUTEX_PROVIDER \n" );
857866
858867 CODEC_TRACE ("sqlcipher_codec_ctx_init: calling provider ctx_init\n" );
859868 if ((rc = ctx -> provider -> ctx_init (& ctx -> provider_ctx )) != SQLITE_OK ) return rc ;
0 commit comments