Fallen-Breath / conditional-mixin

Use annotation to conditionally apply your mixins
GNU Lesser General Public License v3.0
25 stars 5 forks source link

Missing null check on Forge #6

Closed RubixDev closed 3 months ago

RubixDev commented 3 months ago

v0.6.1 introduced this extra check:

https://github.com/Fallen-Breath/conditional-mixin/blob/f805e23d638da3315d41cd45130d9dbd38570cfb/forge/src/main/java/me/fallenbreath/conditionalmixin/api/util/forge/VersionCheckerImpl.java#L19-L22

But when used through the @Restriction annotation, ModList.get() will return null at the time this is called. This causes the game to crash unless the requested mod is present.

Example crash ``` [09:04:30] [main/FATAL] [mixin/]: Mixin prepare failed preparing curios.CPacketScrollMixin in inventorio-forge.mixins.json: org.spongepowered.asm.mixin.transformer.throwables.InvalidMixinException java.lang.NullPointerException: Cannot invoke "net.minecraftforge.fml.ModList.getModFileById(String)" because the return value of "net.minecraftforge.fml.ModList.get()" is null org.spongepowered.asm.mixin.transformer.throwables.InvalidMixinException: java.lang.NullPointerException: Cannot invoke "net.minecraftforge.fml.ModList.getModFileById(String)" because the return value of "net.minecraftforge.fml.ModList.get()" is null at org.spongepowered.asm.mixin.transformer.MixinInfo.(MixinInfo.java:885) ~[mixin-0.8.5.jar:0.8.5+Jenkins-b310.git-155314e6e91465dad727e621a569906a410cd6f4] {} at org.spongepowered.asm.mixin.transformer.MixinConfig.prepareMixins(MixinConfig.java:850) ~[mixin-0.8.5.jar:0.8.5+Jenkins-b310.git-155314e6e91465dad727e621a569906a410cd6f4] {} at org.spongepowered.asm.mixin.transformer.MixinConfig.prepare(MixinConfig.java:775) ~[mixin-0.8.5.jar:0.8.5+Jenkins-b310.git-155314e6e91465dad727e621a569906a410cd6f4] {} at org.spongepowered.asm.mixin.transformer.MixinProcessor.prepareConfigs(MixinProcessor.java:539) ~[mixin-0.8.5.jar:0.8.5+Jenkins-b310.git-155314e6e91465dad727e621a569906a410cd6f4] {} at org.spongepowered.asm.mixin.transformer.MixinProcessor.select(MixinProcessor.java:462) ~[mixin-0.8.5.jar:0.8.5+Jenkins-b310.git-155314e6e91465dad727e621a569906a410cd6f4] {} at org.spongepowered.asm.mixin.transformer.MixinProcessor.checkSelect(MixinProcessor.java:438) ~[mixin-0.8.5.jar:0.8.5+Jenkins-b310.git-155314e6e91465dad727e621a569906a410cd6f4] {} at org.spongepowered.asm.mixin.transformer.MixinProcessor.applyMixins(MixinProcessor.java:290) ~[mixin-0.8.5.jar:0.8.5+Jenkins-b310.git-155314e6e91465dad727e621a569906a410cd6f4] {} at org.spongepowered.asm.mixin.transformer.MixinTransformer.transformClass(MixinTransformer.java:250) ~[mixin-0.8.5.jar:0.8.5+Jenkins-b310.git-155314e6e91465dad727e621a569906a410cd6f4] {} at org.spongepowered.asm.service.modlauncher.MixinTransformationHandler.processClass(MixinTransformationHandler.java:131) ~[mixin-0.8.5.jar:0.8.5+Jenkins-b310.git-155314e6e91465dad727e621a569906a410cd6f4] {} at org.spongepowered.asm.launch.MixinLaunchPluginLegacy.processClass(MixinLaunchPluginLegacy.java:131) ~[mixin-0.8.5.jar:0.8.5+Jenkins-b310.git-155314e6e91465dad727e621a569906a410cd6f4] {} at cpw.mods.modlauncher.serviceapi.ILaunchPluginService.processClassWithFlags(ILaunchPluginService.java:156) ~[modlauncher-10.0.9.jar:10.0.9+10.0.9+main.dcd20f30] {} at cpw.mods.modlauncher.LaunchPluginHandler.offerClassNodeToPlugins(LaunchPluginHandler.java:88) ~[modlauncher-10.0.9.jar:?] {} at cpw.mods.modlauncher.ClassTransformer.transform(ClassTransformer.java:120) ~[modlauncher-10.0.9.jar:?] {} at cpw.mods.modlauncher.TransformingClassLoader.maybeTransformClassBytes(TransformingClassLoader.java:50) ~[modlauncher-10.0.9.jar:?] {} at cpw.mods.cl.ModuleClassLoader.readerToClass(ModuleClassLoader.java:113) ~[securejarhandler-2.1.10.jar:?] {} at cpw.mods.cl.ModuleClassLoader.lambda$findClass$15(ModuleClassLoader.java:219) ~[securejarhandler-2.1.10.jar:?] {} at cpw.mods.cl.ModuleClassLoader.loadFromModule(ModuleClassLoader.java:229) ~[securejarhandler-2.1.10.jar:?] {} at cpw.mods.cl.ModuleClassLoader.findClass(ModuleClassLoader.java:219) ~[securejarhandler-2.1.10.jar:?] {} at java.lang.ClassLoader.loadClass(ClassLoader.java:637) ~[?:?] {} at java.lang.Class.forName(Class.java:545) ~[?:?] {} at net.minecraftforge.fml.earlydisplay.DisplayWindow.lambda$updateModuleReads$18(DisplayWindow.java:598) ~[fmlearlydisplay-1.20.1-47.2.21.jar:1.0] {} at java.util.Optional.map(Optional.java:260) ~[?:?] {} at net.minecraftforge.fml.earlydisplay.DisplayWindow.updateModuleReads(DisplayWindow.java:598) ~[fmlearlydisplay-1.20.1-47.2.21.jar:1.0] {} at net.minecraftforge.fml.loading.ImmediateWindowHandler.acceptGameLayer(ImmediateWindowHandler.java:71) ~[fmlloader-1.20.1-47.2.21.jar:1.0] {} at net.minecraftforge.fml.loading.FMLLoader.beforeStart(FMLLoader.java:207) ~[fmlloader-1.20.1-47.2.21.jar:1.0] {} at net.minecraftforge.fml.loading.targets.CommonLaunchHandler.launchService(CommonLaunchHandler.java:92) ~[fmlloader-1.20.1-47.2.21.jar:?] {} at cpw.mods.modlauncher.LaunchServiceHandlerDecorator.launch(LaunchServiceHandlerDecorator.java:30) ~[modlauncher-10.0.9.jar:?] {} at cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:53) ~[modlauncher-10.0.9.jar:?] {} at cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:71) ~[modlauncher-10.0.9.jar:?] {} at cpw.mods.modlauncher.Launcher.run(Launcher.java:108) ~[modlauncher-10.0.9.jar:?] {} at cpw.mods.modlauncher.Launcher.main(Launcher.java:78) ~[modlauncher-10.0.9.jar:?] {} at cpw.mods.modlauncher.BootstrapLaunchConsumer.accept(BootstrapLaunchConsumer.java:26) ~[modlauncher-10.0.9.jar:?] {} at cpw.mods.modlauncher.BootstrapLaunchConsumer.accept(BootstrapLaunchConsumer.java:23) ~[modlauncher-10.0.9.jar:?] {} at cpw.mods.bootstraplauncher.BootstrapLauncher.main(BootstrapLauncher.java:141) ~[bootstraplauncher-1.1.2.jar:?] {} at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?] {} at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[?:?] {} at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?] {} at java.lang.reflect.Method.invoke(Method.java:568) ~[?:?] {} at io.github.zekerzhayard.forgewrapper.installer.Main.main(Main.java:67) ~[?:?] {} at org.prismlauncher.launcher.impl.StandardLauncher.launch(StandardLauncher.java:87) ~[?:?] {} at org.prismlauncher.EntryPoint.listen(EntryPoint.java:129) ~[?:?] {} at org.prismlauncher.EntryPoint.main(EntryPoint.java:70) ~[?:?] {} Caused by: java.lang.NullPointerException: Cannot invoke "net.minecraftforge.fml.ModList.getModFileById(String)" because the return value of "net.minecraftforge.fml.ModList.get()" is null at me.fallenbreath.conditionalmixin.api.util.forge.VersionCheckerImpl.getModFileInfo(VersionCheckerImpl.java:21) ~[conditional-mixin-forge-0.6.1.jar%23184!/:?] {re:classloading} at me.fallenbreath.conditionalmixin.api.util.forge.VersionCheckerImpl.isModPresent(VersionCheckerImpl.java:38) ~[conditional-mixin-forge-0.6.1.jar%23184!/:?] {re:classloading} at me.fallenbreath.conditionalmixin.api.util.VersionChecker.isModPresent(VersionChecker.java) ~[conditional-mixin-forge-0.6.1.jar%23184!/:?] {re:classloading} at me.fallenbreath.conditionalmixin.impl.SimpleRestrictionChecker.checkConditions(SimpleRestrictionChecker.java:102) ~[conditional-mixin-forge-0.6.1.jar%23184!/:?] {re:classloading} at me.fallenbreath.conditionalmixin.impl.SimpleRestrictionChecker.checkRestriction(SimpleRestrictionChecker.java:49) ~[conditional-mixin-forge-0.6.1.jar%23184!/:?] {re:classloading} at me.fallenbreath.conditionalmixin.impl.MemorizedRestrictionChecker.checkRestriction(MemorizedRestrictionChecker.java:30) ~[conditional-mixin-forge-0.6.1.jar%23184!/:?] {re:classloading} at me.fallenbreath.conditionalmixin.api.mixin.RestrictiveMixinConfigPlugin.shouldApplyMixin(RestrictiveMixinConfigPlugin.java:33) ~[conditional-mixin-forge-0.6.1.jar%23184!/:?] {re:classloading} at org.spongepowered.asm.mixin.transformer.PluginHandle.shouldApplyMixin(PluginHandle.java:132) ~[mixin-0.8.5.jar:0.8.5+Jenkins-b310.git-155314e6e91465dad727e621a569906a410cd6f4] {} at org.spongepowered.asm.mixin.transformer.MixinInfo.shouldApplyMixin(MixinInfo.java:987) ~[mixin-0.8.5.jar:0.8.5+Jenkins-b310.git-155314e6e91465dad727e621a569906a410cd6f4] {} at org.spongepowered.asm.mixin.transformer.MixinInfo.readDeclaredTargets(MixinInfo.java:952) ~[mixin-0.8.5.jar:0.8.5+Jenkins-b310.git-155314e6e91465dad727e621a569906a410cd6f4] {} at org.spongepowered.asm.mixin.transformer.MixinInfo.(MixinInfo.java:881) ~[mixin-0.8.5.jar:0.8.5+Jenkins-b310.git-155314e6e91465dad727e621a569906a410cd6f4] {} ... 41 more ```

The same might be the case for the LoadingModList when called later on, so the best bet is probably to add null checks for both. The same goes for NeoForge.

Fallen-Breath commented 3 months ago

An unexpected null problem oof

Fallen-Breath commented 3 months ago

Try 78035986bc7fff9ff6c33e1b39dad3e1e21cfb0b (can be applied using jitpack) and see if it works

RubixDev commented 3 months ago

~Sorry, I'd love to test, but I seem to have just borked my gradle and now it doesn't think net.minecraft is a package anymore. I hope I get that resolved tomorrow.~

nevermind my dev setup, I just added the mod jar from jitpack to a normal Minecraft instance and that fixed the crash.

RubixDev commented 3 months ago

so yes, it's working