From ea1b6e8ed57bf67b21873abc90adaaa532d1828f Mon Sep 17 00:00:00 2001 From: William S Fulton Date: Thu, 23 Apr 2015 19:17:35 +0100 Subject: [PATCH] Memory leak in java directors when passing byte arrays (char*, size_t) When passing a byte array from c++ to Java using the director feature, the generated jni code does not release a temporary byte array. This is the typemap specified in Java.swg: %typemap(directorin, descriptor="[B") (char *STRING, size_t LENGTH) { jbyteArray jb = (jenv)->NewByteArray($2); (jenv)->SetByteArrayRegion(jb, 0, $2, (jbyte *)$1); $input = jb; } %typemap(directorargout) (char *STRING, size_t LENGTH) %{(jenv)->GetByteArrayRegion($input, 0, $2, (jbyte *)$1); %} Notice that the call to NewByteArray doesn't contain a symmetric release logic as the SetByteArrayRegion/GetByteArrayRegion does. Closes #386 --- CHANGES.current | 3 +++ Lib/java/java.swg | 3 ++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGES.current b/CHANGES.current index 24c36d6a0..4fc30370a 100644 --- a/CHANGES.current +++ b/CHANGES.current @@ -5,6 +5,9 @@ See the RELEASENOTES file for a summary of changes in each release. Version 3.0.6 (in progress) =========================== +2015-04-23: wsfulton + [Java] Bug #386 - Memory leak fix in (char *STRING, size_t LENGTH) typemaps. + 2015-04-23: vadz [Python] Make "default" typemap work again (#330, #377). diff --git a/Lib/java/java.swg b/Lib/java/java.swg index e7e041d13..9374f5783 100644 --- a/Lib/java/java.swg +++ b/Lib/java/java.swg @@ -1346,7 +1346,8 @@ SWIG_PROXY_CONSTRUCTOR(true, true, SWIGTYPE) $input = jb; } %typemap(directorargout) (char *STRING, size_t LENGTH) -%{(jenv)->GetByteArrayRegion($input, 0, $2, (jbyte *)$1); %} +%{(jenv)->GetByteArrayRegion($input, 0, $2, (jbyte *)$1); +(jenv)->DeleteLocalRef($input);%} %apply (char *STRING, size_t LENGTH) { (char *STRING, int LENGTH) } /* java keywords */