RFR: JDK-8149461: jmap kills process if non-java pid is specified in the command line

Chris Plummer chris.plummer at oracle.com
Thu Feb 14 17:07:12 UTC 2019


Hi Gary,

What about the other tools that attach to a user specified process. Do 
they also have this issue?

thanks,

Chris

On 2/14/19 8:35 AM, Gary Adams wrote:
> There is an old reported problem that using jmap on a process that is 
> not running
> Java could cause the process to terminate. This is due to the SIGQUIT 
> used
> when attaching to the process.
>
> It is a fairly simple operation to validate that the pid matches one 
> of the known
> running Java processes using VirtualMachine.list().
>
>   Issue: https://bugs.openjdk.java.net/browse/JDK-8149461
>
> Proposed fix:
>
> diff --git a/src/jdk.jcmd/share/classes/sun/tools/jmap/JMap.java 
> b/src/jdk.jcmd/share/classes/sun/tools/jmap/JMap.java
> --- a/src/jdk.jcmd/share/classes/sun/tools/jmap/JMap.java
> +++ b/src/jdk.jcmd/share/classes/sun/tools/jmap/JMap.java
> @@ -1,5 +1,5 @@
>  /*
> - * Copyright (c) 2005, 2018, Oracle and/or its affiliates. All rights 
> reserved.
> + * Copyright (c) 2005, 2019, Oracle and/or its affiliates. All rights 
> reserved.
>   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
>   *
>   * This code is free software; you can redistribute it and/or modify it
> @@ -30,6 +30,7 @@
>  import java.io.InputStream;
>  import java.io.UnsupportedEncodingException;
>  import java.util.Collection;
> +import java.util.List;
>
>  import com.sun.tools.attach.VirtualMachine;
>  import com.sun.tools.attach.VirtualMachineDescriptor;
> @@ -125,6 +126,10 @@
>      private static void executeCommandForPid(String pid, String 
> command, Object ... args)
>          throws AttachNotSupportedException, IOException,
>                 UnsupportedEncodingException {
> +        // Before attaching, confirm that pid is a known Java process
> +        if (!checkJavaPid(pid)) {
> +            throw new AttachNotSupportedException();
> +        }
>          VirtualMachine vm = VirtualMachine.attach(pid);
>
>          // Cast to HotSpotVirtualMachine as this is an
> @@ -196,6 +201,19 @@
>          executeCommandForPid(pid, "dumpheap", filename, liveopt);
>      }
>
> +    // Check that pid matches a known running Java process
> +    static boolean checkJavaPid(String pid) {
> +        List<VirtualMachineDescriptor> l = VirtualMachine.list();
> +        boolean found = false;
> +        for (VirtualMachineDescriptor vmd: l) {
> +            if (vmd.id().equals(pid)) {
> +                found = true;
> +                break;
> +            }
> +        }
> +        return found;
> +    }
> +
>      private static void checkForUnsupportedOptions(String[] args) {
>          // Check arguments for -F, -m, and non-numeric value
>          // and warn the user that SA is not supported anymore




More information about the serviceability-dev mailing list