From ff1d4ae90507ecf250df4852ffab15b037670f13 Mon Sep 17 00:00:00 2001
From: Sergey Gabdurakhmanov <sgabdura@openjdk.org>
Date: Tue, 23 Jul 2013 09:30:58 +0400
Subject: [PATCH] 8016357: Update hotspot diagnostic class

Add security check to HotSpotDiagnostic.dumpHeap

Reviewed-by: fparain, sla, ahgross
---
 jdk/make/java/management/mapfile-vers                |  2 +-
 jdk/makefiles/mapfiles/libmanagement/mapfile-vers    |  2 +-
 .../com/sun/management/HotSpotDiagnosticMXBean.java  |  5 +++++
 .../classes/sun/management/HotSpotDiagnostic.java    | 12 +++++++++++-
 .../share/native/sun/management/HotSpotDiagnostic.c  |  2 +-
 5 files changed, 19 insertions(+), 4 deletions(-)

diff --git a/jdk/make/java/management/mapfile-vers b/jdk/make/java/management/mapfile-vers
index 63c4fbf03cc..0ea2ab4eb06 100644
--- a/jdk/make/java/management/mapfile-vers
+++ b/jdk/make/java/management/mapfile-vers
@@ -57,7 +57,7 @@ SUNWprivate_1.1 {
 	    Java_sun_management_GcInfoBuilder_fillGcAttributeInfo;
 	    Java_sun_management_GcInfoBuilder_getLastGcInfo0;
 	    Java_sun_management_GcInfoBuilder_getNumGcExtAttributes;
-	    Java_sun_management_HotSpotDiagnostic_dumpHeap;
+	    Java_sun_management_HotSpotDiagnostic_dumpHeap0;
 	    Java_sun_management_HotspotThread_getInternalThreadCount;
 	    Java_sun_management_HotspotThread_getInternalThreadTimes0;
 	    Java_sun_management_MemoryImpl_getMemoryManagers0;
diff --git a/jdk/makefiles/mapfiles/libmanagement/mapfile-vers b/jdk/makefiles/mapfiles/libmanagement/mapfile-vers
index b934fe8b748..724f7bb7100 100644
--- a/jdk/makefiles/mapfiles/libmanagement/mapfile-vers
+++ b/jdk/makefiles/mapfiles/libmanagement/mapfile-vers
@@ -57,7 +57,7 @@ SUNWprivate_1.1 {
 	    Java_sun_management_GcInfoBuilder_fillGcAttributeInfo;
 	    Java_sun_management_GcInfoBuilder_getLastGcInfo0;
 	    Java_sun_management_GcInfoBuilder_getNumGcExtAttributes;
-	    Java_sun_management_HotSpotDiagnostic_dumpHeap;
+	    Java_sun_management_HotSpotDiagnostic_dumpHeap0;
 	    Java_sun_management_HotspotThread_getInternalThreadCount;
 	    Java_sun_management_HotspotThread_getInternalThreadTimes0;
 	    Java_sun_management_MemoryImpl_getMemoryManagers0;
diff --git a/jdk/src/share/classes/com/sun/management/HotSpotDiagnosticMXBean.java b/jdk/src/share/classes/com/sun/management/HotSpotDiagnosticMXBean.java
index 2fe8835259f..eaf5447b430 100644
--- a/jdk/src/share/classes/com/sun/management/HotSpotDiagnosticMXBean.java
+++ b/jdk/src/share/classes/com/sun/management/HotSpotDiagnosticMXBean.java
@@ -66,6 +66,11 @@ public interface HotSpotDiagnosticMXBean extends PlatformManagedObject {
      *                     cannot be created, opened, or written to.
      * @throws UnsupportedOperationException if this operation is not supported.
      * @throws NullPointerException if <tt>outputFile</tt> is <tt>null</tt>.
+     * @throws SecurityException
+     *         If a security manager exists and its {@link
+     *         java.lang.SecurityManager#checkWrite(java.lang.String)}
+     *         method denies write access to the named file
+     *         or the caller does not have ManagmentPermission("control").
      */
     public void dumpHeap(String outputFile, boolean live) throws java.io.IOException;
 
diff --git a/jdk/src/share/classes/sun/management/HotSpotDiagnostic.java b/jdk/src/share/classes/sun/management/HotSpotDiagnostic.java
index a6d3be1640f..7a4bd99f274 100644
--- a/jdk/src/share/classes/sun/management/HotSpotDiagnostic.java
+++ b/jdk/src/share/classes/sun/management/HotSpotDiagnostic.java
@@ -40,7 +40,17 @@ public class HotSpotDiagnostic implements HotSpotDiagnosticMXBean {
     public HotSpotDiagnostic() {
     }
 
-    public native void dumpHeap(String outputFile, boolean live) throws IOException;
+    public void dumpHeap(String outputFile, boolean live) throws IOException {
+        SecurityManager security = System.getSecurityManager();
+        if (security != null) {
+            security.checkWrite(outputFile);
+            Util.checkControlAccess();
+        }
+
+        dumpHeap0(outputFile, live);
+    }
+
+    private native void dumpHeap0(String outputFile, boolean live) throws IOException;
 
     public List<VMOption> getDiagnosticOptions() {
         List<Flag> allFlags = Flag.getAllFlags();
diff --git a/jdk/src/share/native/sun/management/HotSpotDiagnostic.c b/jdk/src/share/native/sun/management/HotSpotDiagnostic.c
index 8d48b201109..cfa9e9ab8fa 100644
--- a/jdk/src/share/native/sun/management/HotSpotDiagnostic.c
+++ b/jdk/src/share/native/sun/management/HotSpotDiagnostic.c
@@ -29,7 +29,7 @@
 #include "sun_management_HotSpotDiagnostic.h"
 
 JNIEXPORT void JNICALL
-Java_sun_management_HotSpotDiagnostic_dumpHeap
+Java_sun_management_HotSpotDiagnostic_dumpHeap0
   (JNIEnv *env, jobject dummy, jstring outputfile, jboolean live)
 {
     jmm_interface->DumpHeap0(env, outputfile, live);