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

Gary Adams gary.adams at oracle.com
Thu Feb 14 16:35:53 UTC 2019


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