Skip to content

Commit 920c1f6

Browse files
Fixes for utilizing copyStringToBuffer
1 parent 5d849b1 commit 920c1f6

File tree

1 file changed

+40
-15
lines changed

1 file changed

+40
-15
lines changed

jni/net_sqlcipher_CursorWindow.cpp

Lines changed: 40 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)