You are right. I found this upon looking:
https://www.securecoding.cert.org/confluence/display/seccode/POS34-C.+Do+not+call+putenv()+with+a+pointer+to+an+automatic+variable+as+the+argument
We moved to malloc since the launcher doesn't know about the value being
passed
with the native memory flag. We can put some limits on value, but that
means
the launcher making a few more decisions. We'll think on this a bit.
What are the possible values for
-XX:NativeMemoryTracking
For the future, are there any other possibilities?
Thanks
-neil
On 6/26/2014 10:57 AM, Zhengyu Gu wrote:
Hi Neil,
There is still an issue. Apparently, you can NOT free the buffer for
the environment variable.
678 char * pbuf = (char*)JLI_MemAlloc(pbuflen);
679 JLI_Snprintf(pbuf, pbuflen, "%s%d=%s", NMT_Env_Name,
JLI_GetPid(), value);
680 retval = JLI_PutEnv(pbuf);
681 if (JLI_IsTraceLauncher()) {
682 char* envName;
683 char* envBuf;
684
685 // ensures that malloc successful
686 envName = (char*)JLI_MemAlloc(pbuflen);
687 JLI_Snprintf(envName, pbuflen, "%s%d", NMT_Env_Name,
JLI_GetPid());
688
689 printf("TRACER_MARKER: NativeMemoryTracking: env var is
%s\n",envName);
690 printf("TRACER_MARKER: NativeMemoryTracking: putenv arg
%s\n",pbuf);
691 envBuf = getenv(envName);
692 printf("TRACER_MARKER: NativeMemoryTracking: got value
%s\n",envBuf);
693 free(envName);
694 }
695
696 free(pbuf); <<<<=== can not free this buffer
697 }
You can experiment it move #696 to #681, you will see the test to fail.
Linux putenv document says:
*putenv*is very widely available, but it might or might not copy its
argument, risking memory leaks.
Thanks,
-Zhengyu
On 6/25/2014 4:40 PM, Neil Toda wrote:
Okay, Very glad you checked. It really does need to go as early as
your prototype suggested.
I'll get right on it.
-neil
On 6/25/2014 12:05 PM, Zhengyu Gu wrote:
Hi Neil,
I tried out this patch with my hotspot, it does not work.
The reason is that, the environment variable is setup too late, it
has to be set before it launches JavaVM (before calling
LoadJavaVM()) method.
Thanks,
-Zhengyu
On 6/25/2014 1:58 PM, Neil Toda wrote:
Sorry. One more webrev .. 06
http://cr.openjdk.java.net/~ntoda/8042469/webrev-06/
Kumar's nit was correct and in fact index was old and should have
been removed
allowing .contains member to be used instead of .indexOf. So
cleaned up a bit more
as can be seen below. Other of Kumar's nits done.
Thanks Kumar.
webrev-06
102 // get the PID from the env var we set for the JVM
103 String envVarPid = null;
104 for (String line : tr.testOutput) {
105 if (line.contains(envVarPidString)) {
106 int sindex = envVarPidString.length();
107 envVarPid = line.substring(sindex);
108 break;
109 }
110 }
111 // did we find envVarPid?
112 if (envVarPid == null) {
113 System.out.println(tr);
114 throw new RuntimeException("Error: failed to find env Var Pid
in tracking info");
115 }
webrev-05
102 // get the PID from the env var we set for the JVM
103 haveLauncherPid = false;
104 String envVarPid = null;
105 for (String line : tr.testOutput) {
106 int index;
107 if ((index = line.indexOf(envVarPidString)) >= 0) {
108 int sindex = envVarPidString.length();
109 envVarPid = line.substring(sindex);
110 haveLauncherPid = true;
111 break;
112 }
113 }
114 // did we find envVarPid?
115 if (!haveLauncherPid) {
116 System.out.println(tr);
117 throw new RuntimeException("Error: failed to find env Var Pid
in tracking info");
118 }
On 6/24/2014 2:28 PM, Neil Toda wrote:
New webrev-05 with Kumar's comments except for the "C'ish" style.
Explained below.
http://cr.openjdk.java.net/~ntoda/8042469/webrev-05/
105 : DONE
146: DONE
168: DONE
106: Your suggestion was the way I had originally coded it for
Linux. However
on Windows/Cygwin, the code will not compile There is
some interaction
with the doExec() preceeding it and the fact that it is a
varlist. This coding
was the simplest workaround.
Thanks for the nits Kumar.
On 6/24/2014 5:36 AM, Kumar Srinivasan wrote:
Neil,
Some nits:
TestSpecialArgs.java:
extra space
105 for ( String line : tr.testOutput) {
This is very C'ish, I suggest.
-106 int index;
-107 if ((index = line.indexOf(envVarPidString))
>= 0) {
+106 int index = line.indexOf(envVarPidString);
+107 if (index >= 0) {
Needs space
-146 launcherPid = line.substring(sindex,tindex);
+146 launcherPid = line.substring(sindex, tindex);
Needs space
-168 if (!tr.contains("NativeMemoryTracking: got
value "+NMT_Option_Value)) {
+168 if (!tr.contains("NativeMemoryTracking: got
value " + NMT_Option_Value)) {
Thanks
Kumar
On 6/23/2014 10:26 AM, Neil Toda wrote:
I've spun a new webrev based on the comments for webrev-03:
http://cr.openjdk.java.net/~ntoda/8042469/webrev-04/
Changes are:
1) java.c
a) add free(envName) line 1063
b) change from malloc() to JLI_MemAlloc() @ lines 1048
and 1056
Thanks
-neil
On 6/20/2014 4:45 PM, Kumar Srinivasan wrote:
Neil,
Generally looks good, yes JLI_* functions must be used, I
missed that one.
Are you going to post another iteration ?
Kumar
On 6/20/2014 4:27 PM, Neil Toda wrote:
Thanks Joe. It would have checked for NULL for me.
I'll use the JLI wrapper.
-neil
On 6/20/2014 4:04 PM, Joe Darcy wrote:
Memory allocation in the launcher should use one of the
JLI_MemAlloc wrappers, if possible.
-Joe
On 06/20/2014 09:50 AM, Neil Toda wrote:
They should complain. Thanks Zhengyu. I'll make sure these
are non-null.
-neil
On 6/20/2014 5:01 AM, Zhengyu Gu wrote:
Neil,
Thanks for quick implementation.
java.c:
Did not check return values of malloc(), I wonder if
source code analyzers will complain.
-Zhengyu
On 6/19/2014 8:29 PM, Neil Toda wrote:
Launcher support for modified Native Memory Tracking
mechanism in JVM in JDK9.
Webrev :
http://cr.openjdk.java.net/~ntoda/8042469/webrev-03/
bug :
https://bugs.openjdk.java.net/browse/JDK-8042469
CCC : http://ccc.us.oracle.com/8042469
Thanks.
-neil