diff options
| author | 2024-06-05 22:04:03 +0000 | |
|---|---|---|
| committer | 2024-06-05 22:04:03 +0000 | |
| commit | d57f4a7e639ebcf948cdf111be5f1d992f14d3d3 (patch) | |
| tree | c8684b0c3a8b452c8f04e5b7717f644c2a004628 | |
| parent | 68291550da248c06692fff4eac462d6f5b99b20b (diff) | |
| parent | 3186c7084373e714cc907daf6c52f26e1854ce4d (diff) | |
Merge "Throw if sqlite runs out of memory" into main
| -rw-r--r-- | core/jni/android_database_SQLiteRawStatement.cpp | 29 |
1 files changed, 27 insertions, 2 deletions
diff --git a/core/jni/android_database_SQLiteRawStatement.cpp b/core/jni/android_database_SQLiteRawStatement.cpp index 8fc13a82e74e..961486474821 100644 --- a/core/jni/android_database_SQLiteRawStatement.cpp +++ b/core/jni/android_database_SQLiteRawStatement.cpp @@ -83,6 +83,16 @@ static void throwIfInvalidColumn(JNIEnv *env, jlong stmtPtr, jint col) { } } +// If the last operation failed, throw an exception and return true. Otherwise return false. +static bool throwIfError(JNIEnv *env, jlong stmtPtr) { + switch (sqlite3_errcode(db(stmtPtr))) { + case SQLITE_OK: + case SQLITE_DONE: + case SQLITE_ROW: return false; + } + throw_sqlite3_exception(env, db(stmtPtr), nullptr); + return true; +} static jint bindParameterCount(JNIEnv* env, jclass, jlong stmtPtr) { return sqlite3_bind_parameter_count(stmt(stmtPtr)); @@ -223,17 +233,24 @@ static jstring columnName(JNIEnv* env, jclass, jlong stmtPtr, jint col) { static jint columnBytes(JNIEnv* env, jclass, jlong stmtPtr, jint col) { throwIfInvalidColumn(env, stmtPtr, col); - return sqlite3_column_bytes16(stmt(stmtPtr), col); + int r = sqlite3_column_bytes16(stmt(stmtPtr), col); + throwIfError(env, stmtPtr); + return r; } - static jbyteArray columnBlob(JNIEnv* env, jclass, jlong stmtPtr, jint col) { throwIfInvalidColumn(env, stmtPtr, col); const void* blob = sqlite3_column_blob(stmt(stmtPtr), col); if (blob == nullptr) { + if (throwIfError(env, stmtPtr)) { + return NULL; + } return (sqlite3_column_type(stmt(stmtPtr), col) == SQLITE_NULL) ? NULL : emptyArray; } size_t size = sqlite3_column_bytes(stmt(stmtPtr), col); + if (throwIfError(env, stmtPtr)) { + return NULL; + } jbyteArray result = env->NewByteArray(size); if (result == nullptr) { // An OutOfMemory exception will have been thrown. @@ -248,9 +265,13 @@ static int columnBuffer(JNIEnv* env, jclass, jlong stmtPtr, jint col, throwIfInvalidColumn(env, stmtPtr, col); const void* blob = sqlite3_column_blob(stmt(stmtPtr), col); if (blob == nullptr) { + throwIfError(env, stmtPtr); return 0; } jsize bsize = sqlite3_column_bytes(stmt(stmtPtr), col); + if (throwIfError(env, stmtPtr)) { + return 0; + } if (bsize == 0 || bsize <= srcOffset) { return 0; } @@ -278,9 +299,13 @@ static jstring columnText(JNIEnv* env, jclass, jlong stmtPtr, jint col) { throwIfInvalidColumn(env, stmtPtr, col); const jchar* text = static_cast<const jchar*>(sqlite3_column_text16(stmt(stmtPtr), col)); if (text == nullptr) { + throwIfError(env, stmtPtr); return NULL; } size_t length = sqlite3_column_bytes16(stmt(stmtPtr), col) / sizeof(jchar); + if (throwIfError(env, stmtPtr)) { + return NULL; + } return env->NewString(text, length); } |