FML now sets a security manager (FINALLY!). It's primary purpose at this point is to catch

rogue calls to System.exit so that they can cause a proper crash report, rather than
silently abandoning the game.
This commit is contained in:
Christian 2014-06-15 16:37:42 -04:00
parent 1c78a09cfd
commit 90ad27d985
2 changed files with 48 additions and 0 deletions

View File

@ -19,6 +19,7 @@ import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import cpw.mods.fml.relauncher.FMLLaunchHandler;
import cpw.mods.fml.relauncher.FMLSecurityManager;
public class FMLTweaker implements ITweaker {
private File gameDir;
@ -26,6 +27,17 @@ public class FMLTweaker implements ITweaker {
private List<String> standaloneArgs;
private static URI jarLocation;
public FMLTweaker()
{
try
{
System.setSecurityManager(new FMLSecurityManager());
}
catch (SecurityException se)
{
throw new RuntimeException("FML was unable to install the security manager. The game will not start", se);
}
}
@SuppressWarnings("unchecked")
@Override
public void acceptOptions(List<String> args, File gameDir, File assetsDir, String profile)

View File

@ -0,0 +1,36 @@
package cpw.mods.fml.relauncher;
import java.security.Permission;
/**
* A custom security manager stopping certain events from happening
* unexpectedly.
*
* @author cpw
*
*/
public class FMLSecurityManager extends SecurityManager {
@Override
public void checkPermission(Permission perm)
{
String permName = perm.getName() != null ? perm.getName() : "missing";
if (permName.startsWith("exitVM"))
{
String callingClass = getClassContext()[4].getName();
// FML is allowed to call system exit
if (!callingClass.startsWith("cpw.mods.fml."))
{
throw new ExitTrappedException();
}
}
else if ("setSecurityManager".equals(permName))
{
throw new SecurityException("Cannot replace the FML security manager");
}
return;
}
public static class ExitTrappedException extends SecurityException {
private static final long serialVersionUID = 1L;
}
}