Handle LDKStr in other structs and fix string conversion overread
[ldk-java] / java_strings.py
index af7672b00b53676af0c8c58d6553e034232a4894..43265f449c2359ebc14d7bcbf803a0f43a0e2d0a 100644 (file)
@@ -60,6 +60,7 @@ public class bindings {
         self.util_fn_pfx = """package org.ldk.structs;
 import org.ldk.impl.bindings;
 import java.util.Arrays;
+import org.ldk.enums.*;
 
 public class UtilMethods {
 """
@@ -308,12 +309,26 @@ typedef jbyteArray int8_tArray;
 
 static inline jstring str_ref_to_java(JNIEnv *env, const char* chars, size_t len) {
        // Sadly we need to create a temporary because Java can't accept a char* without a 0-terminator
-       char* err_buf = MALLOC(len + 1, "str conv buf");
-       memcpy(err_buf, chars, len);
-       err_buf[len] = 0;
-       jstring err_conv = (*env)->NewStringUTF(env, chars);
-       FREE(err_buf);
-       return err_conv;
+       char* conv_buf = MALLOC(len + 1, "str conv buf");
+       memcpy(conv_buf, chars, len);
+       conv_buf[len] = 0;
+       jstring ret = (*env)->NewStringUTF(env, conv_buf);
+       FREE(conv_buf);
+       return ret;
+}
+static inline LDKStr java_to_owned_str(JNIEnv *env, jstring str) {
+       uint64_t str_len = (*env)->GetStringUTFLength(env, str);
+       char* newchars = MALLOC(str_len + 1, "String chars");
+       const char* jchars = (*env)->GetStringUTFChars(env, str, NULL);
+       memcpy(newchars, jchars, str_len);
+       newchars[str_len] = 0;
+       (*env)->ReleaseStringUTFChars(env, str, jchars);
+       LDKStr res = {
+               .chars = newchars,
+               .len = str_len,
+               .chars_is_owned = true
+       };
+       return res;
 }
 """
 
@@ -381,8 +396,10 @@ import java.util.Arrays;
         else:
             return "(*env)->Release" + ty_info.java_ty.strip("[]").title() + "ArrayElements(env, " + arr_name + ", " + dest_name + ", 0)"
 
-    def str_ref_to_c_call(self, var_name, str_len):
+    def str_ref_to_native_call(self, var_name, str_len):
         return "str_ref_to_java(env, " + var_name + ", " + str_len + ")"
+    def str_ref_to_c_call(self, var_name):
+        return "java_to_owned_str(env, " + var_name + ")"
 
     def c_fn_name_define_pfx(self, fn_name, has_args):
         if has_args: