From 8dcdb98480e9ddb3b814c2b5a8c1ffc2af7a53e7 Mon Sep 17 00:00:00 2001 From: Mick Jordan <mick.jordan@oracle.com> Date: Tue, 1 Nov 2016 15:40:00 -0700 Subject: [PATCH] fix mkdtemp bug --- .../fficall/src/jni/base_rffi.c | 12 ++++++++---- .../oracle/truffle/r/runtime/ffi/jni/JNI_Base.java | 11 +++++++++-- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/com.oracle.truffle.r.native/fficall/src/jni/base_rffi.c b/com.oracle.truffle.r.native/fficall/src/jni/base_rffi.c index 0af58786b9..6e19483674 100644 --- a/com.oracle.truffle.r.native/fficall/src/jni/base_rffi.c +++ b/com.oracle.truffle.r.native/fficall/src/jni/base_rffi.c @@ -58,11 +58,15 @@ Java_com_oracle_truffle_r_runtime_ffi_jni_JNI_1Base_native_1setwd(JNIEnv *env, j JNIEXPORT jint JNICALL Java_com_oracle_truffle_r_runtime_ffi_jni_JNI_1Base_native_1mkdtemp(JNIEnv *env, jclass c, jbyteArray jtemplate) { - char *template = (*env)->GetPrimitiveArrayCritical(env, jtemplate, NULL); + char *template = (char*) (*env)->GetByteArrayElements(env, jtemplate, NULL); char *r = mkdtemp(template); - if (r == NULL) return 0; - (*env)->ReleasePrimitiveArrayCritical(env, jtemplate, template, 0); - return 1; + int rc = 1; + if (r == NULL) { + // printf("mkdtemp errno: %d\n", errno); + rc = 0; + } + (*env)->ReleaseByteArrayElements(env, jtemplate, (jbyte*) template, rc == 1 ? 0 : JNI_ABORT); + return rc; } JNIEXPORT jint JNICALL diff --git a/com.oracle.truffle.r.runtime.ffi/src/com/oracle/truffle/r/runtime/ffi/jni/JNI_Base.java b/com.oracle.truffle.r.runtime.ffi/src/com/oracle/truffle/r/runtime/ffi/jni/JNI_Base.java index ca874253e7..e07bf346aa 100644 --- a/com.oracle.truffle.r.runtime.ffi/src/com/oracle/truffle/r/runtime/ffi/jni/JNI_Base.java +++ b/com.oracle.truffle.r.runtime.ffi/src/com/oracle/truffle/r/runtime/ffi/jni/JNI_Base.java @@ -72,12 +72,19 @@ public class JNI_Base implements BaseRFFI { @Override public String mkdtemp(String template) { + /* + * Not only must the (C) string end in XXXXXX it must also be null-terminated. Since it is + * modified by mkdtemp we must make a copy. + */ byte[] bytes = template.getBytes(); - long result = native_mkdtemp(bytes); + byte[] ztbytes = new byte[bytes.length + 1]; + System.arraycopy(bytes, 0, ztbytes, 0, bytes.length); + ztbytes[bytes.length] = 0; + long result = native_mkdtemp(ztbytes); if (result == 0) { return null; } else { - return new String(bytes); + return new String(ztbytes, 0, bytes.length); } } -- GitLab