Skip to content

Commit a7760e9

Browse files
author
Christopher J. Brody
committed
Fix some NullPointerException scenarios
as reproduced in sqlcipher/sqlcipher-android-tests#13 Define SQLiteDatabase.MEMORY for in-memory database.
1 parent 65d27a5 commit a7760e9

File tree

2 files changed

+24
-18
lines changed

2 files changed

+24
-18
lines changed

src/net/sqlcipher/database/SQLiteDatabase.java

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ public void changePassword(char[] password) throws SQLiteException {
119119
if (!isOpen()) {
120120
throw new SQLiteException("database not open");
121121
}
122-
native_rekey(String.valueOf(password));
122+
native_rekey(password == null ? null : String.valueOf(password));
123123
}
124124

125125
private static void loadICUData(Context context, File workingDir) {
@@ -294,6 +294,11 @@ public static synchronized void loadLibs (Context context, File workingDir) {
294294
*/
295295
public static final int CREATE_IF_NECESSARY = 0x10000000; // update native code if changing
296296

297+
/**
298+
* SQLite memory database name
299+
*/
300+
public static final String MEMORY = ":memory:";
301+
297302
/**
298303
* Indicates whether the most-recently started transaction has been marked as successful.
299304
*/
@@ -959,7 +964,7 @@ public Cursor newCursor(SQLiteDatabase db,
959964
* @throws IllegalArgumentException if the database path is null
960965
*/
961966
public static SQLiteDatabase openDatabase(String path, String password, CursorFactory factory, int flags) {
962-
return openDatabase(path, password.toCharArray(), factory, flags, null);
967+
return openDatabase(path, password, factory, flags, null);
963968
}
964969

965970
/**
@@ -981,7 +986,7 @@ public static SQLiteDatabase openDatabase(String path, String password, CursorFa
981986
* @throws IllegalArgumentException if the database path is null
982987
*/
983988
public static SQLiteDatabase openDatabase(String path, char[] password, CursorFactory factory, int flags) {
984-
return openDatabase(path, password, factory, flags, null);
989+
return openDatabase(path, password, factory, flags, null, null);
985990
}
986991

987992
/**
@@ -1005,7 +1010,7 @@ public static SQLiteDatabase openDatabase(String path, char[] password, CursorFa
10051010
* @throws IllegalArgumentException if the database path is null
10061011
*/
10071012
public static SQLiteDatabase openDatabase(String path, String password, CursorFactory factory, int flags, SQLiteDatabaseHook hook) {
1008-
return openDatabase(path, password.toCharArray(), factory, flags, hook);
1013+
return openDatabase(path, password, factory, flags, hook, null);
10091014
}
10101015

10111016
/**
@@ -1029,7 +1034,7 @@ public static SQLiteDatabase openDatabase(String path, String password, CursorFa
10291034
* @throws IllegalArgumentException if the database path is null
10301035
*/
10311036
public static SQLiteDatabase openDatabase(String path, char[] password, CursorFactory factory, int flags, SQLiteDatabaseHook hook) {
1032-
return openDatabase(path, password, factory, flags, hook, new DefaultDatabaseErrorHandler());
1037+
return openDatabase(path, password, factory, flags, hook, null);
10331038
}
10341039

10351040
/**
@@ -1056,7 +1061,7 @@ public static SQLiteDatabase openDatabase(String path, char[] password, CursorFa
10561061
*/
10571062
public static SQLiteDatabase openDatabase(String path, String password, CursorFactory factory, int flags,
10581063
SQLiteDatabaseHook hook, DatabaseErrorHandler errorHandler) {
1059-
return openDatabase(path, password.toCharArray(), factory, flags, hook, errorHandler);
1064+
return openDatabase(path, password == null ? null : password.toCharArray(), factory, flags, hook, errorHandler);
10601065
}
10611066

10621067
/**
@@ -1084,10 +1089,11 @@ public static SQLiteDatabase openDatabase(String path, String password, CursorFa
10841089
public static SQLiteDatabase openDatabase(String path, char[] password, CursorFactory factory, int flags,
10851090
SQLiteDatabaseHook hook, DatabaseErrorHandler errorHandler) {
10861091
SQLiteDatabase sqliteDatabase = null;
1092+
DatabaseErrorHandler myErrorHandler = (errorHandler != null) ? errorHandler : new DefaultDatabaseErrorHandler();
10871093

10881094
try {
10891095
// Open the database.
1090-
sqliteDatabase = new SQLiteDatabase(path, factory, flags, errorHandler);
1096+
sqliteDatabase = new SQLiteDatabase(path, factory, flags, myErrorHandler);
10911097
sqliteDatabase.openDatabaseInternal(password, hook);
10921098
} catch (SQLiteDatabaseCorruptException e) {
10931099
// Try to recover from this, if possible.
@@ -1097,10 +1103,10 @@ public static SQLiteDatabase openDatabase(String path, char[] password, CursorFa
10971103
// NOTE: if this errorHandler.onCorruption() throws the exception _should_
10981104
// bubble back to the original caller.
10991105
// DefaultDatabaseErrorHandler deletes the corrupt file, EXCEPT for memory database
1100-
errorHandler.onCorruption(sqliteDatabase);
1106+
myErrorHandler.onCorruption(sqliteDatabase);
11011107

11021108
// try *once* again:
1103-
sqliteDatabase = new SQLiteDatabase(path, factory, flags, errorHandler);
1109+
sqliteDatabase = new SQLiteDatabase(path, factory, flags, myErrorHandler);
11041110
sqliteDatabase.openDatabaseInternal(password, hook);
11051111
}
11061112

@@ -1122,7 +1128,7 @@ public static SQLiteDatabase openDatabase(String path, char[] password, CursorFa
11221128
* Equivalent to openDatabase(file.getPath(), password, factory, CREATE_IF_NECESSARY, databaseHook).
11231129
*/
11241130
public static SQLiteDatabase openOrCreateDatabase(File file, String password, CursorFactory factory, SQLiteDatabaseHook databaseHook) {
1125-
return openOrCreateDatabase(file.getPath(), password, factory, databaseHook);
1131+
return openOrCreateDatabase(file, password, factory, databaseHook, null);
11261132
}
11271133

11281134
/**
@@ -1137,12 +1143,12 @@ public static SQLiteDatabase openOrCreateDatabase(String path, String password,
11371143
*/
11381144
public static SQLiteDatabase openOrCreateDatabase(File file, String password, CursorFactory factory, SQLiteDatabaseHook databaseHook,
11391145
DatabaseErrorHandler errorHandler) {
1140-
return openDatabase(file.getPath(), password.toCharArray(), factory, CREATE_IF_NECESSARY, databaseHook, errorHandler);
1146+
return openOrCreateDatabase(file == null ? null : file.getPath(), password, factory, databaseHook, errorHandler);
11411147
}
11421148

11431149
public static SQLiteDatabase openOrCreateDatabase(String path, String password, CursorFactory factory, SQLiteDatabaseHook databaseHook,
11441150
DatabaseErrorHandler errorHandler) {
1145-
return openDatabase(path, password.toCharArray(), factory, CREATE_IF_NECESSARY, databaseHook, errorHandler);
1151+
return openDatabase(path, password == null ? null : password.toCharArray(), factory, CREATE_IF_NECESSARY, databaseHook, errorHandler);
11461152
}
11471153

11481154
public static SQLiteDatabase openOrCreateDatabase(String path, char[] password, CursorFactory factory, SQLiteDatabaseHook databaseHook) {
@@ -1158,14 +1164,14 @@ public static SQLiteDatabase openOrCreateDatabase(String path, char[] password,
11581164
* Equivalent to openDatabase(file.getPath(), password, factory, CREATE_IF_NECESSARY).
11591165
*/
11601166
public static SQLiteDatabase openOrCreateDatabase(File file, String password, CursorFactory factory) {
1161-
return openOrCreateDatabase(file.getPath(), password, factory, null);
1167+
return openOrCreateDatabase(file, password, factory, null);
11621168
}
11631169

11641170
/**
11651171
* Equivalent to openDatabase(path, password, factory, CREATE_IF_NECESSARY).
11661172
*/
11671173
public static SQLiteDatabase openOrCreateDatabase(String path, String password, CursorFactory factory) {
1168-
return openDatabase(path, password.toCharArray(), factory, CREATE_IF_NECESSARY, null);
1174+
return openDatabase(path, password, factory, CREATE_IF_NECESSARY, null);
11691175
}
11701176

11711177
/**
@@ -1192,7 +1198,7 @@ public static SQLiteDatabase openOrCreateDatabase(String path, char[] password,
11921198
*/
11931199
public static SQLiteDatabase create(CursorFactory factory, String password) {
11941200
// This is a magic string with special meaning for SQLite.
1195-
return openDatabase(":memory:", password.toCharArray(), factory, CREATE_IF_NECESSARY);
1201+
return openDatabase(MEMORY, password == null ? null : password.toCharArray(), factory, CREATE_IF_NECESSARY);
11961202
}
11971203

11981204
/**
@@ -1211,7 +1217,7 @@ public static SQLiteDatabase create(CursorFactory factory, String password) {
12111217
* @throws SQLiteException if the database cannot be opened
12121218
*/
12131219
public static SQLiteDatabase create(CursorFactory factory, char[] password) {
1214-
return openDatabase(":memory:", password, factory, CREATE_IF_NECESSARY);
1220+
return openDatabase(MEMORY, password, factory, CREATE_IF_NECESSARY);
12151221
}
12161222

12171223

src/net/sqlcipher/database/SQLiteOpenHelper.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ public SQLiteOpenHelper(Context context, String name, CursorFactory factory,
126126
*/
127127

128128
public synchronized SQLiteDatabase getWritableDatabase(String password) {
129-
return getWritableDatabase(password.toCharArray());
129+
return getWritableDatabase(password == null ? null : password.toCharArray());
130130
}
131131

132132
public synchronized SQLiteDatabase getWritableDatabase(char[] password) {
@@ -211,7 +211,7 @@ public synchronized SQLiteDatabase getWritableDatabase(char[] password) {
211211
* or {@link #close} is called.
212212
*/
213213
public synchronized SQLiteDatabase getReadableDatabase(String password) {
214-
return getReadableDatabase(password.toCharArray());
214+
return getReadableDatabase(password == null ? null : password.toCharArray());
215215
}
216216

217217
public synchronized SQLiteDatabase getReadableDatabase(char[] password) {

0 commit comments

Comments
 (0)