@@ -337,34 +337,59 @@ namespace sqlcipher {
337337 if (type == FIELD_TYPE_STRING) {
338338 uint32_t size = field.data .buffer .size ;
339339 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) ;
344344 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);
347349 } else {
348- memcpy (dst, (jchar const *)result , strSize * 2 );
350+ memcpy (dst, elements , strSize * 2 );
349351 }
350352 sizeCopied = strSize;
351353 }
352354 } else if (type == FIELD_TYPE_INTEGER) {
353355 int64_t value;
354356 if (window->getLong (row, column, &value)) {
355- char buf[32 ];
356357 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+ }
360373 }
361374 } else if (type == FIELD_TYPE_FLOAT) {
362375 double value;
363376 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+ }
368393 }
369394 } else if (type == FIELD_TYPE_NULL) {
370395 } else if (type == FIELD_TYPE_BLOB) {
0 commit comments