@@ -337,34 +337,59 @@ namespace sqlcipher {
337
337
if (type == FIELD_TYPE_STRING) {
338
338
uint32_t size = field.data .buffer .size ;
339
339
if (size > 0 ) {
340
- jstring input = env-> NewStringUTF (( const char *)window-> offsetToPtr (field. data . buffer . offset ) );
341
- const jchar* buffer = env-> GetStringChars (input, JNI_FALSE );
342
- jstring result = env->NewString (buffer, size - 1 );
343
- int32_t strSize = size - 1 ;
340
+ jsize length = (jsize)size/ sizeof (jchar );
341
+ int32_t strSize = (jsize)size/ sizeof (jchar );
342
+ jstring content = env->NewString (( const jchar *)window-> offsetToPtr (field. data . buffer . offset ), length );
343
+ const jchar *elements = env-> GetStringChars (content, JNI_FALSE) ;
344
344
if (strSize > bufferSize || dst == NULL ) {
345
- newArray = env->NewCharArray (strSize);
346
- env->SetCharArrayRegion (newArray, 0 , strSize, (jchar const *)result);
345
+ newArray = env->NewCharArray (length);
346
+ env->SetCharArrayRegion (newArray, 0 , length, elements);
347
+ if (elements) env->ReleaseStringChars (content, elements);
348
+ if (content) env->DeleteLocalRef (content);
347
349
} else {
348
- memcpy (dst, (jchar const *)result , strSize * 2 );
350
+ memcpy (dst, elements , strSize * 2 );
349
351
}
350
352
sizeCopied = strSize;
351
353
}
352
354
} else if (type == FIELD_TYPE_INTEGER) {
353
355
int64_t value;
354
356
if (window->getLong (row, column, &value)) {
355
- char buf[32 ];
356
357
int len;
357
- snprintf (buf, sizeof (buf), " %lld" , value);
358
- jchar* dst = env->GetCharArrayElements (buffer, NULL );
359
- sizeCopied = charToJchar (buf, dst, bufferSize);
358
+ char buf[32 ];
359
+ len = snprintf (buf, sizeof (buf), " %lld" , value);
360
+ jint bufferLength = env->GetArrayLength (buffer);
361
+ if (len > bufferLength || dst == NULL ){
362
+ jstring content = env->NewStringUTF (buf);
363
+ const jchar *elements = env->GetStringChars (content, JNI_FALSE);
364
+ newArray = env->NewCharArray (len);
365
+ env->SetCharArrayRegion (newArray, 0 , len, elements);
366
+ sizeCopied = len;
367
+ if (elements) env->ReleaseStringChars (content, elements);
368
+ if (content) env->DeleteLocalRef (content);
369
+ } else {
370
+ memcpy (dst, buf, len);
371
+ sizeCopied = charToJchar (buf, dst, bufferSize);
372
+ }
360
373
}
361
374
} else if (type == FIELD_TYPE_FLOAT) {
362
375
double value;
363
376
if (window->getDouble (row, column, &value)) {
364
- char tempbuf[32 ];
365
- snprintf (tempbuf, sizeof (tempbuf), " %g" , value);
366
- jchar* dst = env->GetCharArrayElements (buffer, NULL );
367
- sizeCopied = charToJchar (tempbuf, dst, bufferSize);
377
+ int len;
378
+ char buf[32 ];
379
+ len = snprintf (buf, sizeof (buf), " %g" , value);
380
+ jint bufferLength = env->GetArrayLength (buffer);
381
+ if (len > bufferLength || dst == NULL ){
382
+ jstring content = env->NewStringUTF (buf);
383
+ const jchar *elements = env->GetStringChars (content, JNI_FALSE);
384
+ newArray = env->NewCharArray (len);
385
+ env->SetCharArrayRegion (newArray, 0 , len, elements);
386
+ sizeCopied = len;
387
+ if (elements) env->ReleaseStringChars (content, elements);
388
+ if (content) env->DeleteLocalRef (content);
389
+ } else {
390
+ memcpy (dst, buf, len);
391
+ sizeCopied = charToJchar (buf, dst, bufferSize);
392
+ }
368
393
}
369
394
} else if (type == FIELD_TYPE_NULL) {
370
395
} else if (type == FIELD_TYPE_BLOB) {
0 commit comments