Dmitry,

Thank you for your explanation.
I've added length check with 4096 bytes in new webrev:

  http://cr.openjdk.java.net/~ysuenaga/JDK-8147388/webrev.04/

PATH_MAX is not defined Visual C++ 2015.
So I do not use this macro.


Could you review again?


Thanks,

Yasumasa


On 2016/01/22 18:41, Dmitry Samersoff wrote:
Yasumasa,

It's dangerous to allow arbitrary length string to be passed to running
process. We should limit it to some reasonable value.

It is much easier to increase the limit if necessary than debug random
allocation failures caused by too long string.

e.g.

Corrupted script (or admin mistake) send a 1Gb of garbage to VM as an
options. VM successfully allocate memory for options within DCMD but OOM
later somewhere in C2 or JVMTI.

How long it takes to find real cause of the problem?

-Dmitry

On 2016-01-22 11:56, Yasumasa Suenaga wrote:
Dmitry,

Can we limit the length of argument?
I guess that we can pass more length when we use -agentlib, -javaagent, etc.
(I do not know about commandline length.)

Thanks,

Yasumasa

2016/01/22 17:45 "Dmitry Samersoff" <dmitry.samers...@oracle.com
<mailto:dmitry.samers...@oracle.com>>:

     Yasumasa,

     I would prefer to check that opt_len is less than PATH_MAX *before* any
     attempt to allocate memory to avoid any possible attack/missuses.

     I.e.:

     int opt_len = strlen(_libpath.value()) + strlen(_option.value()) + 2;
     if (opt_len > PATH_MAX) {
        output()->print_cr("JVMTI agent attach failed: "
       "Options is too long.");
        return;
     }

     char *opt = (char *)os::malloc(opt_len, mtInternal);
     if (opt == NULL) {
       output()->print_cr("JVMTI agent attach failed: "
                          "Could not allocate %d bytes for argument.",
                                   opt_len);
     }


     -Dmitry


     On 2016-01-22 06:21, Yasumasa Suenaga wrote:
     > Hi,
     >
     > I think that we can check malloc error as below:
     > --------------
     >       int opt_len = strlen(_libpath.value()) +
     strlen(_option.value()) + 2;
     >       char *opt = (char *)os::malloc(opt_len, mtInternal);
     >       if (opt == NULL) {
     >         // 4096 comes from PATH_MAX at Linux.
     >         if (opt_len > 4096) {
     >           output()->print_cr("JVMTI agent attach failed: "
     >                              "Could not allocate %d bytes for
     argument.",
     >                              opt_len);
     >         } else {
     >           // VM might not work because memory exhausted.
     >           vm_exit_out_of_memory(opt_len, OOM_MALLOC_ERROR,
     >                                 "JVMTIAgentLoadDCmd::execute");
     >         }
     >       }
     > --------------
     >
     > If you think that this code should NOT be available in dcmd, I
     will remove
     > vm_exit_out_of_memory() from it.
     >
     >
     > Thanks,
     >
     > Yasumasa
     >
     >
     > 2016-01-20 18:06 GMT+09:00 Yasumasa Suenaga <yasue...@gmail.com
     <mailto:yasue...@gmail.com>
     > <mailto:yasue...@gmail.com <mailto:yasue...@gmail.com>>>:
     >
     >     I agree to Dmitry.
     >
     >     Most case of malloc error, native memory is exhausted.
     >     Thus I think process (or system) is illegal state. It should
     be shut
     >     down.
     >     If do not so, malloc failure might be occurred another point.
     >
     >     However, I think that it is very difficult to set the threshold.
     >     If it can be clear, I will make a new webrev.
     >
     >     Thanks,
     >
     >     Yasumasa
     >
     >     2016/01/20 17:03 "Dmitry Samersoff"
     <dmitry.samers...@oracle.com <mailto:dmitry.samers...@oracle.com>
     >     <mailto:dmitry.samers...@oracle.com
     <mailto:dmitry.samers...@oracle.com>>>:
     >
     >         David,
     >
     >         PS:
     >          It might be a good to check opt_len for some large enough
     value
     >         (like
     >         2048) before allocation attempt and send back a message.
     >
     >         -Dmitry
     >
     >         On 2016-01-20 08:03, David Holmes wrote:
     >         > On 20/01/2016 9:13 AM, Yasumasa Suenaga wrote:
     >         >> Hi David,
     >         >>
     >         >> ShouldNotReachHere( ) is called at NMTDcmd:
     >         >>
     >
      
http://hg.openjdk.java.net/jdk9/hs-rt/hotspot/file/8fcd5cba7938/src/share/vm/services/nmtDCmd.cpp#l156
     >         >>
     >         >
     >         > Sure but that is more of a debugging check - we never expect
     >         to reach
     >         > that code.
     >         >
     >         > Unfortunately I do see some other implicit aborts due to
     >         allocation
     >         > failures, but I have to say this seems very wrong to me.
     >         >
     >         > David
     >         > -----
     >         >
     >         >> If target VM is aborted, caller (e.g. jcmd) cannot receive
     >         response. I
     >         >> think that the caller show Exception.
     >         >>
     >         >> Thanks,
     >         >>
     >         >> Yasumasa
     >         >>
     >         >> 2016/01/20 7:37 "David Holmes" <david.hol...@oracle.com
     <mailto:david.hol...@oracle.com>
     >         <mailto:david.hol...@oracle.com
     <mailto:david.hol...@oracle.com>>
     >         >> <mailto:david.hol...@oracle.com
     <mailto:david.hol...@oracle.com>
     >         <mailto:david.hol...@oracle.com
     <mailto:david.hol...@oracle.com>>>>:
     >         >>
     >         >>     On 19/01/2016 11:19 PM, Yasumasa Suenaga wrote:
     >         >>
     >         >>         Hi,
     >         >>
     >         >>         I uploaded a new webrev:
     >         >>
     >          http://cr.openjdk.java.net/~ysuenaga/JDK-8147388/webrev.03/
     >         >>
     >         >>         It is malloc/free version.
     >         >>         If NULL returns from malloc(), it calls
     >         vm_exit_out_of_memory().
     >         >>
     >         >>
     >         >>     That seems rather extreme - do other dcmd failures
     abort
     >         the VM? I
     >         >>     would have expected some kind of error propagation back
     >         to the
     >         >> caller.
     >         >>
     >         >>     Thanks,
     >         >>     David
     >         >>
     >         >>         All test about this changes work fine.
     >         >>         Please review.
     >         >>
     >         >>         Thanks,
     >         >>
     >         >>         Yasumasa
     >         >>
     >         >>
     >         >>         On 2016/01/19 22:07, Dmitry Samersoff wrote:
     >         >>
     >         >>             David,
     >         >>
     >         >>                 Anytime we start to use a language feature
     >         for the first
     >         >>                 time we need
     >         >>                 to be extra diligent to make sure there are
     >         no unintended
     >         >>                 side-effects and that all our supported
     >         compilers (and
     >         >>                 probably a few
     >         >>                 others used in the community) do the right
     >         thing. A bit
     >         >>                 of googling
     >         >>                 seems to indicate that variable length
     arrays
     >         are part
     >         >>                 of C99 but are
     >         >>                 not allowed in C++ - though gcc has an
     >         extension that
     >         >>                 does allow
     >         >>                 them.
     >         >>
     >         >>
     >         >>             I hear your concern.
     >         >>
     >         >>             Moreover I revisit my advice and think it's
     not a
     >         good idea
     >         >>             to do a
     >         >>             stack allocation based on unverified user
     input.
     >         >>
     >         >>             Yasumasa, sorry for leading in wrong direction.
     >         Lets use
     >         >>             malloc/free in
     >         >>             this case.
     >         >>
     >         >>             Nevertheless, I would like to start broader
     >         evaluation of
     >         >>             possible use
     >         >>             on-stack allocation (either alloca or VLA) -
     >         hotspot may
     >         >>             benefit of it
     >         >>             in many places.
     >         >>
     >         >>             -Dmitry
     >         >>
     >         >>             On 2016-01-19 02:06, David Holmes wrote:
     >         >>
     >         >>                 On 19/01/2016 7:26 AM, Dmitry Samersoff
     wrote:
     >         >>
     >         >>                     David,
     >         >>
     >         >>                     On 2016-01-18 23:47, David Holmes
     wrote:
     >         >>
     >         >>                         On 18/01/2016 11:20 PM, Dmitry
     >         Samersoff wrote:
     >         >>
     >         >>                             Yasumasa,
     >         >>
     >         >>                                 Can we use VLA (Variable
     >         Length Arrays) ?
     >         >>
     >         >>
     >         >>                             Apple LLVM version 6.1.0
     >         (clang-602.0.53)
     >         >>                             (based on LLVM
     >         >>                             3.6.0svn) Target:
     >         x86_64-apple-darwin14.5.0
     >         >>                             Thread model:
     >         >>                             posix
     >         >>
     >         >>                             Compiles it just fine.
     >         >>
     >         >>
     >         >>                         Are we using variable length arrays
     >         anywhere
     >         >>                         else in the VM yet?
     >         >>
     >         >>
     >         >>                     Probably not.
     >         >>
     >         >>                     But personally, I see no reason to
     don't
     >         use it for
     >         >>                     simple cases
     >         >>                     like this one.
     >         >>
     >         >>
     >         >>                 Anytime we start to use a language feature
     >         for the first
     >         >>                 time we need
     >         >>                 to be extra diligent to make sure there are
     >         no unintended
     >         >>                 side-effects and that all our supported
     >         compilers (and
     >         >>                 probably a few
     >         >>                 others used in the community) do the right
     >         thing. A bit
     >         >>                 of googling
     >         >>                 seems to indicate that variable length
     arrays
     >         are part
     >         >>                 of C99 but are
     >         >>                 not allowed in C++ - though gcc has an
     >         extension that
     >         >>                 does allow
     >         >>                 them.
     >         >>
     >         >>                 This reports they are not available in
     Visual
     >         Studio C++:
     >         >>
     >         >>
     >          https://msdn.microsoft.com/en-us/library/zb1574zs.aspx
     >         >>
     >         >>                 David -----
     >         >>
     >         >>                         What are the implications for
     >         allocation and in
     >         >>                         particular
     >         >>                         allocation failure?
     >         >>
     >         >>
     >         >>                     This allocation just reserves some
     space
     >         on the
     >         >>                     stack[1], so it
     >         >>                     can cause stack overflow if we
     attempt to
     >         allocate
     >         >>                     two much bytes.
     >         >>
     >         >>
     >         >>
     >         >>
     >         >>                     1. Listing fragment (extra labels are
     >         removed)
     >         >>
     >         >>                     3                    .Ltext0: 5
     >         >> .LC0:
     >         >>
     >         >>                     14:test.cxx      **** void
     testme(int n) {
     >         >>                     15:test.cxx      ****
     >         >>                     char m[n]; 25 0000 4863FF
     >         movslq
     >         >>                     %edi, %rdi 28 0003
     >         >>                     55                    pushq   %rbp 37
     >         0004 BE000000
     >         >>                     movl    $.LC0, %esi 41 0009 4883C70F
     >         >>                     addq    $15,
     >         >>                     %rdi 46 000d 31C0                  xorl
     >           %eax,
     >         >>                     %eax 50 000f
     >         >>                     4883E7F0              andq    $-16,
     %rdi
     >         54 0013
     >         >> 4889E5
     >         >>                     movq    %rsp, %rbp 59 0016 4829FC
     >         >>                     subq    %rdi,
     >         >>                     %rsp 64 0019 BF010000              movl
     >           $1, %edi
     >         >>                     65 001e 4889E2
     >         >>                     movq    %rsp, %rdx 66 0021 E8000000
     >                 call
     >         >>                     __printf_chk 16:test.cxx      ****
     >          printf("%s",
     >         >>                     m); 17:test.cxx
     >         >>                     **** }
     >         >>
     >         >>                     -Dmitry
     >         >>
     >         >>
     >         >>
     >         >>                         David -----
     >         >>
     >         >>                             -Dmitry
     >         >>
     >         >>                             On 2016-01-18 16:09, Yasumasa
     >         Suenaga wrote:
     >         >>
     >         >>                                 Hi Dmitry,
     >         >>
     >         >>                                     1. It might be
     better to
     >         have one
     >         >>                                     jcmd to run both
     java and
     >         >>                                     native java agent. If
     >         agent library
     >         >>                                     name ends with ".jar"
     >         >>                                     we can assume it's java
     >         agent.
     >         >>
     >         >>
     >         >>                                 Okay, I'll try it.
     >         >>
     >         >>                                     if (_libpath.value() ==
     >         NULL) {
     >         >>                                     error ... }
     >         >>
     >         >>
     >         >>                                 I will add it. However, I
     >         note you that
     >         >>                                 _libpath is given
     >         >>                                 mandatory flag.
     >         >>
     >         >>
     >
      
http://mail.openjdk.java.net/pipermail/serviceability-dev/2016-January/018661.html
     >         >>
     >         >>
     >         >>
     >         >>
     >         >>
     >         >>
     >         >>
     >         >>
     >         >>             char options[option_len];
     >         >>
     >         >>
     >         >>                                 Can we use VLA (Variable
     >         Length Arrays)
     >         >>                                 ? I'm worried that
     >         >>                                 several C++ compiler cannot
     >         compile this
     >         >>                                 code.
     >         >>
     >         >> http://clang.llvm.org/compatibility.html#vla
     >         >>
     >         >>
     >         >>                                 Thanks,
     >         >>
     >         >>                                 Yasumasa
     >         >>
     >         >>
     >         >>                                 On 2016/01/18 19:38, Dmitry
     >         Samersoff
     >         >> wrote:
     >         >>
     >         >>                                     Yasumasa,
     >         >>
     >         >>                                     1. It might be
     better to
     >         have one
     >         >>                                     jcmd to run both
     java and
     >         >>                                     native java agent. If
     >         agent library
     >         >>                                     name ends with ".jar"
     >         >>                                     we can assume it's java
     >         agent.
     >         >>
     >         >>                                     2. Please get rid of
     >         malloc/free and
     >         >>                                     check _libpath.value()
     >         >>                                     for NULL at ll. 295 and
     >         below.
     >         >>
     >         >>
     >         >>                                     if (_libpath.value() ==
     >         NULL) {
     >         >>                                     error ... }
     >         >>
     >         >>                                     if (_option.value() ==
     >         NULL) {
     >         >>
     >         >> JvmtiExport::load_agent_library("instrument",
     >         >>                                     "false",
     >         >>                                     _libpath.value(),
     output());
     >         >> return; }
     >         >>
     >         >>                                     size_t option_len = \
     >         >>
      strlen(_libpath.value()) +
     >         >>
      strlen(_option.value()) + 1;
     >         >>
     >         >>                                     char
     options[option_len];
     >         >>
     >         >>                                     ....
     >         >>
     >         >>                                     -Dmitry
     >         >>
     >         >>
     >         >>                                     On 2016-01-15
     16:33, Yasumasa
     >         >>                                     Suenaga wrote:
     >         >>
     >         >>                                         Hi,
     >         >>
     >         >>                                         I added permissions
     >         and tests in
     >         >>                                         new webrev:
     >         >>
     >         >> http://cr.openjdk.java.net/~ysuenaga/JDK-8147388/webrev.01/
     >         >>
     >         >>
     >         >>
     >         >>             Two tests (LoadAgentDcmdTest,
     >         LoadJavaAgentDcmdTest) work
     >         >> fine.
     >         >>
     >         >>
     >         >>
     >         >>                                         Thanks,
     >         >>
     >         >>                                         Yasumasa
     >         >>
     >         >>
     >         >>                                         On 2016/01/15
     17:20,
     >         Staffan
     >         >>                                         Larsen wrote:
     >         >>
     >         >>                                             This is a good
     >         improvement
     >         >>                                             overall.
     >         >>
     >         >>                                             The new
     >         diagnostic commands
     >         >>                                             need to
     have proper
     >         >>                                             permissions
     set:
     >         >>
     >         >>                                             static const
     >         JavaPermission
     >         >>                                             permission() {
     >         >>
      JavaPermission p =
     >         >>
     >         >> {"java.lang.management.ManagementPermission",
     >         >>                                             “control",
     NULL};
     >         return p; }
     >         >>
     >         >>                                             And as David
     >         said: tests! See
     >         >>
     >         >> hotspot/test/serviceability/dcmd/jvmti.
     >         >>
     >         >>                                             Thanks,
     /Staffan
     >         >>
     >         >>                                                 On 14 jan.
     >         2016, at
     >         >>                                                 15:00,
     >         Yasumasa Suenaga
     >         >>
     >          <yasue...@gmail.com <mailto:yasue...@gmail.com>
     <mailto:yasue...@gmail.com <mailto:yasue...@gmail.com>>
     >         >>
     >         >> <mailto:yasue...@gmail.com <mailto:yasue...@gmail.com>
     <mailto:yasue...@gmail.com <mailto:yasue...@gmail.com>>>>
     >         >>                                                 wrote:
     >         >>
     >         >>                                                 Hi all,
     >         >>
     >         >>                                                 We can use
     >         Attach API to
     >         >>                                                 attach
     JVMTI
     >         agent to
     >         >> live
     >         >>                                                 process.
     >         However, we
     >         >>                                                 have to
     write
     >         Java code
     >         >>                                                 for it.
     >         >>
     >         >>                                                 If we can
     >         attach JVMTI
     >         >>                                                 agents
     >         through jcmd,
     >         >> it is
     >         >>                                                 very
     useful.
     >         So I want
     >         >>                                                 to add two
     >         new diagnostic
     >         >>                                                 commands:
     >         >>
     >         >>                                                 *
     >         JVMTI.agent_load: Load
     >         >>                                                 JVMTI
     native
     >         agent. *
     >         >>
     >          JVMTI.javaagent_load:
     >         >>                                                 Load JVMTI
     >         java agent.
     >         >>
     >         >>                                                 I maintain
     >         two JVMTI
     >         >>                                                 agents -
     >         HeapStats [1]
     >         >> and
     >         >>
      JLivePatcher
     >         [2]. [1] is
     >         >>                                                 native
     agent,
     >         [2] is java
     >         >>                                                 agent. They
     >         provide a
     >         >>                                                 program for
     >         attaching to
     >         >>                                                 live
     >         >>                                                 process.
     >         >>
     >         >>                                                 I guess
     that
     >         various
     >         >>                                                 JVMTI
     agents
     >         provide own
     >         >>                                                 attach
     >         >>                                                 mechanism
     >         like them. I
     >         >>                                                 think
     that we
     >         should
     >         >> provide
     >         >>                                                 general way
     >         to attach.
     >         >>
     >         >>                                                 I've
     uploaded
     >         webrev.
     >         >>                                                 Could you
     >         review it?
     >         >>
     >         >> http://cr.openjdk.java.net/~ysuenaga/JDK-8147388/webrev.00/
     >         >>
     >         >>
     >         >>
     >         >>             I'm jdk9 committer, however I cannot access
     JPRT.
     >         >>
     >         >>                                                 So I need a
     >         sponsor.
     >         >>
     >         >>
     >         >>                                                 Thanks,
     >         >>
     >         >>                                                 Yasumasa
     >         >>
     >         >>
     >         >>                                                 [1]
     >         >>
     >         >> http://icedtea.classpath.org/wiki/HeapStats
     >         >>                                                 [2]
     >         >>
     >         >> https://github.com/YaSuenag/jlivepatcher
     >         >>                                                 (in
     >         >>                                                 Japanese)
     >         >>
     >         >>
     >         >>
     >         >>
     >         >>
     >         >>
     >         >>
     >         >>
     >         >>
     >         >>
     >
     >
     >         --
     >         Dmitry Samersoff
     >         Oracle Java development team, Saint Petersburg, Russia
     >         * I would love to change the world, but they won't give me the
     >         sources.
     >
     >


     --
     Dmitry Samersoff
     Oracle Java development team, Saint Petersburg, Russia
     * I would love to change the world, but they won't give me the sources.



Reply via email to