]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Replace JNI::NewStringUTF() for the remaining cases where output may be incompatible...
authorstephan <stephan@noemail.net>
Sat, 19 Aug 2023 08:22:34 +0000 (08:22 +0000)
committerstephan <stephan@noemail.net>
Sat, 19 Aug 2023 08:22:34 +0000 (08:22 +0000)
FossilOrigin-Name: 2d955eef25ab116c487ebc34c6f2d2836d310af239ef1993f5aeee5a3f68d590

ext/jni/src/c/sqlite3-jni.c
ext/jni/src/org/sqlite/jni/Fts5ExtensionApi.java
ext/jni/src/org/sqlite/jni/SQLite3Jni.java
manifest
manifest.uuid

index d68c29e22018586b499b997d88530de4dc960a3a..3595eba0aa991d6df8f967a5af9f2954be56d6b9 100644 (file)
@@ -2321,7 +2321,8 @@ JDECL(jobject,1commit_1hook)(JENV_CSELF,jobject jDb, jobject jHook){
 
 
 JDECL(jstring,1compileoption_1get)(JENV_CSELF, jint n){
-  return (*env)->NewStringUTF( env, sqlite3_compileoption_get(n) );
+  return (*env)->NewStringUTF( env, sqlite3_compileoption_get(n) )
+    /* We know these to be ASCII, so MUTF-8 is fine. */;
 }
 
 JDECL(jboolean,1compileoption_1used)(JENV_CSELF, jstring name){
@@ -2515,7 +2516,7 @@ JDECL(jint,1db_1config__Lorg_sqlite_jni_sqlite3_2IILorg_sqlite_jni_OutputPointer
 
 JDECL(jstring,1db_1filename)(JENV_CSELF, jobject jDb, jstring jDbName){
   S3JniDb * const ps = S3JniDb_for_db(env, jDb, 0);
-  S3JniEnv * const jc = S3JniGlobal_env_cache(env);
+  S3JniEnv * const jc = ps ? S3JniGlobal_env_cache(env) : 0;
   char *zDbName;
   jstring jRv = 0;
   int nStr = 0;
@@ -3066,20 +3067,19 @@ static int s3jni_xAuth(void* pState, int op,const char*z0, const char*z1,
                        const char*z2,const char*z3){
   S3JniDb * const ps = pState;
   JNIEnv * const env = ps->env;
-  jstring const s0 = z0 ? (*env)->NewStringUTF(env, z0) : 0;
-  jstring const s1 = z1 ? (*env)->NewStringUTF(env, z1) : 0;
-  jstring const s2 = z2 ? (*env)->NewStringUTF(env, z2) : 0;
-  jstring const s3 = z3 ? (*env)->NewStringUTF(env, z3) : 0;
+  S3JniEnv * const jc = S3JniGlobal_env_cache(env);
   S3JniHook const * const pHook = &ps->authHook;
+  jstring const s0 = z0 ? s3jni_utf8_to_jstring(jc, z0, -1) : 0;
+  jstring const s1 = z1 ? s3jni_utf8_to_jstring(jc, z1, -1) : 0;
+  jstring const s2 = z2 ? s3jni_utf8_to_jstring(jc, z2, -1) : 0;
+  jstring const s3 = z3 ? s3jni_utf8_to_jstring(jc, z3, -1) : 0;
   int rc;
 
   assert( pHook->jObj );
   rc = (*env)->CallIntMethod(env, pHook->jObj, pHook->midCallback, (jint)op,
                              s0, s1, s3, s3);
   IFTHREW{
-    EXCEPTION_WARN_CALLBACK_THREW("sqlite3_set_authorizer() callback");
-    EXCEPTION_CLEAR;
-    if( !rc ) rc = SQLITE_ERROR;
+    rc = s3jni_db_exception(env, ps, rc, "sqlite3_set_authorizer() callback");
   }
   UNREF_L(s0);
   UNREF_L(s1);
@@ -3296,13 +3296,11 @@ static void s3jni_update_hook_impl(void * pState, int opId, const char *zDb,
                                    const char *zTable, sqlite3_int64 nRowid){
   S3JniDb * const ps = pState;
   JNIEnv * const env = ps->env;
-  /* ACHTUNG: this will break if zDb or zTable contain chars which are
-     different in MUTF-8 than UTF-8. That seems like a low risk,
-     but it's possible. */
+  S3JniEnv * const jc = S3JniGlobal_env_cache(env);
   jstring jDbName;
   jstring jTable;
-  jDbName  = (*env)->NewStringUTF(env, zDb);
-  jTable = jDbName ? (*env)->NewStringUTF(env, zTable) : 0;
+  jDbName  = s3jni_utf8_to_jstring(jc, zDb, -1);
+  jTable = jDbName ? s3jni_utf8_to_jstring(jc, zTable, -1) : 0;
   IFTHREW {
     s3jni_db_error(ps->pDb, SQLITE_NOMEM, 0);
   }else{
@@ -3311,8 +3309,7 @@ static void s3jni_update_hook_impl(void * pState, int opId, const char *zDb,
                            (jint)opId, jDbName, jTable, (jlong)nRowid);
     IFTHREW{
       EXCEPTION_WARN_CALLBACK_THREW("update hook");
-      EXCEPTION_CLEAR;
-      s3jni_db_error(ps->pDb, SQLITE_ERROR, "update hook callback threw.");
+      s3jni_db_exception(env, ps, 0, "update hook callback threw");
     }
   }
   UNREF_L(jDbName);
index ac041e3001c49961b78bda2e3f6cec073c8774d7..4937a32fa9b32a3c7dc5169d428acf43f12d4ed0 100644 (file)
@@ -77,7 +77,7 @@ public final class Fts5ExtensionApi extends NativePointerHolder<Fts5ExtensionApi
      pAux held by the JNI layer will be relinquished regardless of
      whether pAux has an xDestroy() method. */
   public synchronized native int xSetAuxdata(@NotNull Fts5Context cx, @Nullable Object pAux);
-  public synchronized native int xTokenize(@NotNull Fts5Context cx, @NotNull byte pText[],
+  public synchronized native int xTokenize(@NotNull Fts5Context cx, @NotNull byte[] pText,
                               @NotNull Fts5.xTokenizeCallback callback);
 
   public synchronized native Object xUserData(Fts5Context cx);
index 74676b48b65639d7cef4a134e1320c4defb9dbe9..3d76eef607ad862a8bad6161e452b7463571fab0 100644 (file)
@@ -82,27 +82,16 @@ import java.lang.annotation.ElementType;
   The known consequences and limitations this discrepancy places on
   the SQLite3 JNI binding include:
 
-  - Any functions which return client-side data from a database
-    take extra care to perform proper conversion, at the cost of
-    efficiency.
-
-  - Functions which return database identifiers require those
-    identifiers to have identical representations in UTF-8 and
-    MUTF-8. They do not perform such conversions (A) because of the
-    much lower risk of an encoding discrepancy and (B) to avoid
-    significant extra code involved (see both the Java- and C-side
-    implementations of sqlite3_db_filename() for an example).  Names
-    of databases, tables, columns, collations, and functions MUST NOT
-    contain characters which differ in MUTF-8 and UTF-8, or certain
-    APIs will mis-translate them on their way between languages
-    (possibly leading to a crash).
+  - Any functions which return state from a database take extra care
+    to perform proper conversion, at the cost of efficiency.
 
   - C functions which take C-style strings without a length argument
     require special care when taking input from Java. In particular,
     Java strings converted to byte arrays for encoding purposes are
     not NUL-terminated, and conversion to a Java byte array must be
     careful to add one. Functions which take a length do not require
-    this. Search the SQLite3Jni class for "\0" for many examples.
+    this so long as the length is provided. Search the SQLite3Jni
+    class for "\0" for many examples.
 
   - Similarly, C-side code which deals with strings which might not be
     NUL-terminated (e.g. while tokenizing in FTS5-related code) cannot
index fb4339f427758c7dd520a7975af469c67330c4ad..0ca122a07a9bd63799dfc10e1200a8153db30da2 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Remove\ssome\sobsolete\sJNI-internal\sdocs.
-D 2023-08-17T22:04:07.712
+C Replace\sJNI::NewStringUTF()\sfor\sthe\sremaining\scases\swhere\soutput\smay\sbe\sincompatible\swith\sMUTF-8.\sIt\sis\snow\sonly\sused\swhen\swe\sknow\sthe\soutput\sto\sbe\splain\sASCII.
+D 2023-08-19T08:22:34.056
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -234,7 +234,7 @@ F ext/icu/sqliteicu.h fa373836ed5a1ee7478bdf8a1650689294e41d0c89c1daab26e9ae78a3
 F ext/jni/GNUmakefile a9e11b92e620058558cbc1a2d49f8ec53c78d6a989b9db0b7d0b649b9f174881
 F ext/jni/README.md 7a614a2fa6c561205f7a53fd8626cf93a7b5711ff454fc1814517f796df398eb
 F ext/jni/jar-dist.make f90a553203a57934bf275bed86479485135a52f48ac5c1cfe6499ae07b0b35a4
-F ext/jni/src/c/sqlite3-jni.c 2682b02c376290924927386e8e0ab16c8b88feb50df584147e81696d8fb459e2
+F ext/jni/src/c/sqlite3-jni.c a8b51e4c63572d1655dafea38b80fd63528684264c6483b5c4d1eb9098c44712
 F ext/jni/src/c/sqlite3-jni.h f10d2f38720687c70ecdd5e44f6e8db98efee2caa05fc86b2d9e0c76e6cc0a18
 F ext/jni/src/org/sqlite/jni/Authorizer.java 1308988f7f40579ea0e4deeaec3c6be971630566bd021c31367fe3f5140db892
 F ext/jni/src/org/sqlite/jni/AutoExtension.java 18e83f6f463e306df60b2dceb65247d32af1f78af4bbbae9155411a8c6cdb093
@@ -244,7 +244,7 @@ F ext/jni/src/org/sqlite/jni/CollationNeeded.java ad67843b6dd1c06b6b0a1dc72887b7
 F ext/jni/src/org/sqlite/jni/CommitHook.java 87c6a8e5138c61a8eeff018fe16d23f29219150239746032687f245938baca1a
 F ext/jni/src/org/sqlite/jni/Fts5.java 13844685231e8b4840a706db3bed84d5dfcf15be0ae7e809eac40420dba24901
 F ext/jni/src/org/sqlite/jni/Fts5Context.java 0a5a02047a6a1dd3e4a38b0e542a8dd2de365033ba30e6ae019a676305959890
-F ext/jni/src/org/sqlite/jni/Fts5ExtensionApi.java 01f890105c6b7edbbad1c0f5635f783cea62c4b2ae694a71e76514a936ee03ec
+F ext/jni/src/org/sqlite/jni/Fts5ExtensionApi.java 93c0643e77a0226dad31610489490c6348ed9842c91e98f3ab0c440a173e75e7
 F ext/jni/src/org/sqlite/jni/Fts5Function.java 65cde7151e441fee012250a5e03277de7babcd11a0c308a832b7940574259bcc
 F ext/jni/src/org/sqlite/jni/Fts5PhraseIter.java 6642beda341c0b1b46af4e2d7f6f9ab03a7aede43277b2c92859176d6bce3be9
 F ext/jni/src/org/sqlite/jni/Fts5Tokenizer.java 91489893596b6528c0df5cd7180bd5b55809c26e2b797fb321dfcdbc1298c060
@@ -254,7 +254,7 @@ F ext/jni/src/org/sqlite/jni/ProgressHandler.java 6f62053a828a572de809828b1ee495
 F ext/jni/src/org/sqlite/jni/ResultCode.java ba701f20213a5f259e94cfbfdd36eb7ac7ce7797f2c6c7fca2004ff12ce20f86
 F ext/jni/src/org/sqlite/jni/RollbackHook.java b04c8abcc6ade44a8a57129e33765793f69df0ba909e49ba18d73f4268d92564
 F ext/jni/src/org/sqlite/jni/SQLFunction.java 09ce81c1c637e31c3a830d4c859cce95d65f5e02ff45f8bd1985b3479381bc46
-F ext/jni/src/org/sqlite/jni/SQLite3Jni.java 99334f54f5f41feb4c14dc988b93219e37799e032f2bc07bda6323b1dfb99e75
+F ext/jni/src/org/sqlite/jni/SQLite3Jni.java 26b3083501a9f42e9aa49b941f6b378213cf91ae1a8f705602773ed750043a3c
 F ext/jni/src/org/sqlite/jni/Tester1.java 68b88b3098ce60134f4298488f890871398a77477af0a1b21797c59c911060c1
 F ext/jni/src/org/sqlite/jni/TesterFts5.java 59e22dd24af033ea8827d36225a2f3297908fb6af8818ead8850c6c6847557b1
 F ext/jni/src/org/sqlite/jni/Tracer.java a5cece9f947b0af27669b8baec300b6dd7ff859c3e6a6e4a1bd8b50f9714775d
@@ -2091,8 +2091,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P c09c8d05a20d916a9d9304eeea723ef7666a862a9e53f5feeeb1b03f9153d4b2
-R 8dc048810b080415033a7139c2c39321
+P 00a2a3736a6dcde81d920815520040f3c47f965165e7128ca1f4062e6ec7c17c
+R 844cfc265e8ec15b67feebeb0f56ea87
 U stephan
-Z f47443de82631501c87889e378989189
+Z a99a318492abbd023ca99730c8ec8838
 # Remove this line to create a well-formed Fossil manifest.
index 38b3001c56849003b6e01152af7d0e2ece0153b0..6d462b62c8b5f3873c75ab4694d2fdf99d3299d2 100644 (file)
@@ -1 +1 @@
-00a2a3736a6dcde81d920815520040f3c47f965165e7128ca1f4062e6ec7c17c
\ No newline at end of file
+2d955eef25ab116c487ebc34c6f2d2836d310af239ef1993f5aeee5a3f68d590
\ No newline at end of file