You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by su...@apache.org on 2019/12/19 03:09:31 UTC

[groovy] 02/05: Improve robustness

This is an automated email from the ASF dual-hosted git repository.

sunlan pushed a commit to branch GROOVY_3_0_X
in repository https://gitbox.apache.org/repos/asf/groovy.git

commit 73cbb4d41f218deadcf830b929c2f9544795e8e2
Author: Daniel Sun <su...@apache.org>
AuthorDate: Thu Dec 19 08:23:46 2019 +0800

    Improve robustness
    
    (cherry picked from commit 2737292fcc9b0a16e1fdd90d7a0347e083bd7cec)
---
 .../codehaus/groovy/vmplugin/VMPluginFactory.java  | 38 +++++++++++++++-------
 .../java/org/codehaus/groovy/ant/VerifyClass.java  | 30 ++++++++++-------
 2 files changed, 46 insertions(+), 22 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/vmplugin/VMPluginFactory.java b/src/main/java/org/codehaus/groovy/vmplugin/VMPluginFactory.java
index f6cf64a..679c1b6 100644
--- a/src/main/java/org/codehaus/groovy/vmplugin/VMPluginFactory.java
+++ b/src/main/java/org/codehaus/groovy/vmplugin/VMPluginFactory.java
@@ -18,14 +18,21 @@
  */
 package org.codehaus.groovy.vmplugin;
 
+import org.codehaus.groovy.runtime.DefaultGroovyMethods;
 import org.codehaus.groovy.vmplugin.v7.Java7;
 
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
 /**
  * Factory class to get functionality based on the VM version.
  * The usage of this class is not for public use, only for the
  * runtime.
  */
 public class VMPluginFactory {
+    private static final Logger LOGGER = Logger.getLogger(VMPluginFactory.class.getName());
 
     private static final String JDK8_CLASSNAME_CHECK = "java.util.Optional";
     private static final String JDK9_CLASSNAME_CHECK = "java.lang.Module";
@@ -33,7 +40,7 @@ public class VMPluginFactory {
     private static final String JDK8_PLUGIN_NAME = "org.codehaus.groovy.vmplugin.v8.Java8";
     private static final String JDK9_PLUGIN_NAME = "org.codehaus.groovy.vmplugin.v9.Java9";
 
-    private static final VMPlugin plugin;
+    private static final VMPlugin PLUGIN;
 
     static {
         VMPlugin target = createPlugin(JDK9_CLASSNAME_CHECK, JDK9_PLUGIN_NAME);
@@ -43,20 +50,29 @@ public class VMPluginFactory {
                 target = new Java7();
             }
         }
-        plugin = target;
+
+        PLUGIN = target;
     }
 
     public static VMPlugin getPlugin() {
-        return plugin;
+        return PLUGIN;
     }
 
-    private static VMPlugin createPlugin(String classNameCheck, String pluginName) {
-        try {
-            ClassLoader loader = VMPluginFactory.class.getClassLoader();
-            loader.loadClass(classNameCheck);
-            return (VMPlugin) loader.loadClass(pluginName).getDeclaredConstructor().newInstance();
-        } catch (Throwable ex) {
-            return null;
-        }
+    private static VMPlugin createPlugin(final String classNameCheck, final String pluginName) {
+        return AccessController.doPrivileged((PrivilegedAction<VMPlugin>) () -> {
+            try {
+                ClassLoader loader = VMPluginFactory.class.getClassLoader();
+                loader.loadClass(classNameCheck);
+                return (VMPlugin) loader.loadClass(pluginName).getDeclaredConstructor().newInstance();
+            } catch (Throwable t) {
+                if (LOGGER.isLoggable(Level.FINE)) {
+                    LOGGER.fine("Trying to create VM plugin `" + pluginName + "` by checking `" + classNameCheck
+                            + "`, but failed:\n" + DefaultGroovyMethods.asString(t)
+                    );
+                }
+
+                return null;
+            }
+        });
     }
 }
diff --git a/subprojects/groovy-ant/src/main/java/org/codehaus/groovy/ant/VerifyClass.java b/subprojects/groovy-ant/src/main/java/org/codehaus/groovy/ant/VerifyClass.java
index f660d40..975c4c5 100644
--- a/subprojects/groovy-ant/src/main/java/org/codehaus/groovy/ant/VerifyClass.java
+++ b/subprojects/groovy-ant/src/main/java/org/codehaus/groovy/ant/VerifyClass.java
@@ -31,9 +31,11 @@ import org.objectweb.asm.tree.analysis.SimpleVerifier;
 import org.objectweb.asm.util.CheckClassAdapter;
 import org.objectweb.asm.util.TraceMethodVisitor;
 
+import java.io.BufferedInputStream;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
+import java.io.InputStream;
 import java.util.List;
 
 /**
@@ -94,18 +96,24 @@ public class VerifyClass extends MatchingTask {
     }
 
     private boolean readClass(String clazz) throws IOException {
-        ClassReader cr = new ClassReader(new FileInputStream(clazz));
-        ClassNode ca = new ClassNode() {
-            public void visitEnd() {
-                //accept(cv);
-            }
-        };
-        cr.accept(new CheckClassAdapter(ca), ClassWriter.COMPUTE_MAXS);
-        boolean failed = false;
+        ClassNode ca;
+        try (final InputStream inputStream =
+                     new BufferedInputStream(
+                             new FileInputStream(clazz))) {
+            ClassReader cr = new ClassReader(inputStream);
+            ca = new ClassNode() {
+                @Override
+                public void visitEnd() {
+                    //accept(cv);
+                }
+            };
+            cr.accept(new CheckClassAdapter(ca), ClassWriter.COMPUTE_MAXS);
+        }
 
-        List methods = ca.methods;
-        for (int i = 0; i < methods.size(); ++i) {
-            MethodNode method = (MethodNode) methods.get(i);
+        boolean failed = false;
+        List<MethodNode> methods = ca.methods;
+        for (int i = 0, n = methods.size(); i < n; ++i) {
+            MethodNode method = methods.get(i);
             if (method.instructions.size() > 0) {
                 Analyzer a = new Analyzer(new SimpleVerifier());
                 try {