Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

BlockHound: Add Kotlin reflection to default allowed blocking calls #2303

Closed
fluidsonic opened this issue Oct 15, 2020 · 1 comment
Closed
Assignees

Comments

@fluidsonic
Copy link

fluidsonic commented Oct 15, 2020

CoroutinesBlockHoundIntegration should probably add exceptions for blocking calls caused by Kotlin reflection API:

reactor.blockhound.BlockingOperationError: Blocking call! java.io.RandomAccessFile#readBytes
	at java.base/java.io.RandomAccessFile.readBytes(RandomAccessFile.java)
	at java.base/java.io.RandomAccessFile.read(RandomAccessFile.java:408)
	at java.base/java.io.RandomAccessFile.readFully(RandomAccessFile.java:472)
	at java.base/java.util.zip.ZipFile$Source.readFullyAt(ZipFile.java:1239)
	at java.base/java.util.zip.ZipFile$ZipFileInputStream.initDataOffset(ZipFile.java:933)
	at java.base/java.util.zip.ZipFile$ZipFileInputStream.read(ZipFile.java:948)
	at java.base/java.util.zip.ZipFile$ZipFileInflaterInputStream.fill(ZipFile.java:460)
	at java.base/java.util.zip.InflaterInputStream.read(InflaterInputStream.java:159)
	at java.base/java.io.InputStream.readNBytes(InputStream.java:498)
	at java.base/java.util.jar.JarFile.getBytes(JarFile.java:806)
	at java.base/java.util.jar.JarFile.checkForSpecialAttributes(JarFile.java:1006)
	at java.base/java.util.jar.JarFile.isMultiRelease(JarFile.java:388)
	at java.base/java.util.jar.JarFile.getEntry(JarFile.java:507)
	at java.base/sun.net.www.protocol.jar.URLJarFile.getEntry(URLJarFile.java:131)
	at java.base/sun.net.www.protocol.jar.JarURLConnection.connect(JarURLConnection.java:137)
	at java.base/sun.net.www.protocol.jar.JarURLConnection.getInputStream(JarURLConnection.java:155)
	at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.parse(ServiceLoader.java:1165)
	at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.nextProviderClass(ServiceLoader.java:1206)
	at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.hasNextService(ServiceLoader.java:1221)
	at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.hasNext(ServiceLoader.java:1265)
	at java.base/java.util.ServiceLoader$2.hasNext(ServiceLoader.java:1300)
	at java.base/java.util.ServiceLoader$3.hasNext(ServiceLoader.java:1385)
	at kotlin.collections.CollectionsKt___CollectionsKt.toCollection(_Collections.kt:1243)
	at kotlin.collections.CollectionsKt___CollectionsKt.toMutableList(_Collections.kt:1276)
	at kotlin.collections.CollectionsKt___CollectionsKt.toList(_Collections.kt:1267)
	at kotlin.reflect.jvm.internal.impl.resolve.OverridingUtil.<clinit>(OverridingUtil.java:49)
	at kotlin.reflect.jvm.internal.impl.types.checker.NewKotlinTypeCheckerImpl.<init>(NewKotlinTypeChecker.kt:75)
	at kotlin.reflect.jvm.internal.impl.types.checker.NewKotlinTypeChecker$Companion.<clinit>(NewKotlinTypeChecker.kt:69)
	at kotlin.reflect.jvm.internal.impl.types.checker.NewKotlinTypeChecker.<clinit>(NewKotlinTypeChecker.kt)
	at kotlin.reflect.jvm.internal.impl.descriptors.runtime.components.RuntimeModuleDataKt.makeLazyJavaPackageFragmentFromClassLoaderProvider(RuntimeModuleData.kt:120)
	at kotlin.reflect.jvm.internal.impl.descriptors.runtime.components.RuntimeModuleDataKt.makeLazyJavaPackageFragmentFromClassLoaderProvider$default(RuntimeModuleData.kt:110)
	at kotlin.reflect.jvm.internal.impl.descriptors.runtime.components.RuntimeModuleData$Companion.create(RuntimeModuleData.kt:68)
	at kotlin.reflect.jvm.internal.ModuleByClassLoaderKt.getOrCreateModule(moduleByClassLoader.kt:58)
	at kotlin.reflect.jvm.internal.KDeclarationContainerImpl$Data$moduleData$2.invoke(KDeclarationContainerImpl.kt:37)
	at kotlin.reflect.jvm.internal.KDeclarationContainerImpl$Data$moduleData$2.invoke(KDeclarationContainerImpl.kt:34)
	at kotlin.reflect.jvm.internal.ReflectProperties$LazySoftVal.invoke(ReflectProperties.java:92)
	at kotlin.reflect.jvm.internal.ReflectProperties$Val.getValue(ReflectProperties.java:31)
	at kotlin.reflect.jvm.internal.KDeclarationContainerImpl$Data.getModuleData(KDeclarationContainerImpl.kt)
	at kotlin.reflect.jvm.internal.KClassImpl$Data$descriptor$2.invoke(KClassImpl.kt:49)
	at kotlin.reflect.jvm.internal.KClassImpl$Data$descriptor$2.invoke(KClassImpl.kt:46)
	at kotlin.reflect.jvm.internal.ReflectProperties$LazySoftVal.invoke(ReflectProperties.java:92)
	at kotlin.reflect.jvm.internal.ReflectProperties$Val.getValue(ReflectProperties.java:31)
	at kotlin.reflect.jvm.internal.KClassImpl$Data.getDescriptor(KClassImpl.kt)
	at kotlin.reflect.jvm.internal.KClassImpl.getDescriptor(KClassImpl.kt:181)
	at kotlin.reflect.jvm.internal.KClassImpl.getDescriptor(KClassImpl.kt:43)
	at kotlin.reflect.full.KClassifiers.createType(KClassifiers.kt:47)
	at kotlin.reflect.jvm.internal.ReflectionFactoryImpl.typeOf(ReflectionFactoryImpl.java:123)
	at kotlin.jvm.internal.Reflection.typeOf(Reflection.java:127)
	at io.fluidsonic.raptor.BsonRaptorFeature$beginConfiguration$1$1.invoke(BsonRaptorFeature.kt:44)
	at io.fluidsonic.raptor.BsonRaptorFeature$beginConfiguration$1$1.invoke(BsonRaptorFeature.kt:7)
	at io.fluidsonic.raptor.RaptorDIFeatureKt$di$1.invoke(RaptorDIFeature.kt:21)
	at io.fluidsonic.raptor.RaptorDIFeatureKt$di$1.invoke(RaptorDIFeature.kt)
	at io.fluidsonic.raptor.DefaultRaptorComponentRegistry$RegistrationSet.configure(DefaultRaptorComponentRegistry.kt:177)
	at io.fluidsonic.raptor.RaptorComponentRegistryKt.configure(RaptorComponentRegistry.kt:29)
	at io.fluidsonic.raptor.RaptorDIFeatureKt.di(RaptorDIFeature.kt:20)
	at io.fluidsonic.raptor.BsonRaptorFeature$beginConfiguration$1.invoke(BsonRaptorFeature.kt:21)
	at io.fluidsonic.raptor.BsonRaptorFeature$beginConfiguration$1.invoke(BsonRaptorFeature.kt:7)
	at io.fluidsonic.raptor.RaptorFeatureInstallCheckScopeKt$ifInstalled$$inlined$with$lambda$1.invoke(RaptorFeatureInstallCheckScope.kt:14)
	at io.fluidsonic.raptor.RaptorFeatureInstallCheckScopeKt$ifInstalled$$inlined$with$lambda$1.invoke(RaptorFeatureInstallCheckScope.kt)
	at io.fluidsonic.raptor.DefaultRaptorRootComponent.applyLazyFeatureConfigurations(DefaultRaptorRootComponent.kt:28)
	at io.fluidsonic.raptor.DefaultRaptorRootComponent.install(DefaultRaptorRootComponent.kt:67)
	at io.fluidsonic.raptor.RaptorQuickstartFeature.beginConfiguration(RaptorQuickstartFeature.kt:13)
	at io.fluidsonic.raptor.DefaultRaptorRootComponent.install(DefaultRaptorRootComponent.kt:64)
	at edis.MainRaptorKt$mainRaptor$1.invoke(MainRaptor.kt:12)
	at edis.MainRaptorKt$mainRaptor$1.invoke(MainRaptor.kt)
	at io.fluidsonic.raptor.RaptorKt.raptor(Raptor.kt:25)
	at edis.MainRaptorKt.mainRaptor(MainRaptor.kt:9)
	at edis.MainKt.main(Main.kt:63)
	at edis.MainKt$$$main.invoke(Unknown Source)
	at kotlin.coroutines.intrinsics.IntrinsicsKt__IntrinsicsJvmKt$createCoroutineUnintercepted$$inlined$createCoroutineFromSuspendFunction$IntrinsicsKt__IntrinsicsJvmKt$1.invokeSuspend(IntrinsicsJvm.kt:205)
	at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
	at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:115)
	at kotlin.coroutines.jvm.internal.RunSuspendKt.runSuspend(RunSuspend.kt:19)
	at edis.MainKt.main(Main.kt)
reactor.blockhound.BlockingOperationError: Blocking call! java.io.RandomAccessFile#readBytes
	at java.base/java.io.RandomAccessFile.readBytes(RandomAccessFile.java)
	at java.base/java.io.RandomAccessFile.read(RandomAccessFile.java:408)
	at java.base/java.io.RandomAccessFile.readFully(RandomAccessFile.java:472)
	at java.base/java.util.zip.ZipFile$Source.readFullyAt(ZipFile.java:1239)
	at java.base/java.util.zip.ZipFile$ZipFileInputStream.initDataOffset(ZipFile.java:933)
	at java.base/java.util.zip.ZipFile$ZipFileInputStream.read(ZipFile.java:948)
	at java.base/java.util.zip.ZipFile$ZipFileInflaterInputStream.fill(ZipFile.java:460)
	at java.base/java.util.zip.InflaterInputStream.read(InflaterInputStream.java:159)
	at java.base/java.util.zip.InflaterInputStream.read(InflaterInputStream.java:123)
	at java.base/java.io.FilterInputStream.read(FilterInputStream.java:83)
	at java.base/java.io.DataInputStream.readInt(DataInputStream.java:392)
	at kotlin.reflect.jvm.internal.impl.metadata.builtins.BuiltInsBinaryVersion$Companion.readFrom(BuiltInsBinaryVersion.kt:29)
	at kotlin.reflect.jvm.internal.impl.serialization.deserialization.builtins.BuiltInsPackageFragmentImpl$Companion.create(BuiltInsPackageFragmentImpl.kt:38)
	at kotlin.reflect.jvm.internal.impl.builtins.jvm.JvmBuiltInsPackageFragmentProvider.findPackage(JvmBuiltInsPackageFragmentProvider.kt:61)
	at kotlin.reflect.jvm.internal.impl.serialization.deserialization.AbstractDeserializedPackageFragmentProvider$fragments$1.invoke(AbstractDeserializedPackageFragmentProvider.kt:34)
	at kotlin.reflect.jvm.internal.impl.serialization.deserialization.AbstractDeserializedPackageFragmentProvider$fragments$1.invoke(AbstractDeserializedPackageFragmentProvider.kt:26)
	at kotlin.reflect.jvm.internal.impl.storage.LockBasedStorageManager$MapBasedMemoizedFunction.invoke(LockBasedStorageManager.java:527)
	at kotlin.reflect.jvm.internal.impl.serialization.deserialization.AbstractDeserializedPackageFragmentProvider.getPackageFragments(AbstractDeserializedPackageFragmentProvider.kt:41)
	at kotlin.reflect.jvm.internal.impl.descriptors.impl.CompositePackageFragmentProvider.getPackageFragments(CompositePackageFragmentProvider.kt:31)
	at kotlin.reflect.jvm.internal.impl.descriptors.impl.CompositePackageFragmentProvider.getPackageFragments(CompositePackageFragmentProvider.kt:31)
	at kotlin.reflect.jvm.internal.impl.descriptors.impl.LazyPackageViewDescriptorImpl$fragments$2.invoke(LazyPackageViewDescriptorImpl.kt:37)
	at kotlin.reflect.jvm.internal.impl.descriptors.impl.LazyPackageViewDescriptorImpl$fragments$2.invoke(LazyPackageViewDescriptorImpl.kt:30)
	at kotlin.reflect.jvm.internal.impl.storage.LockBasedStorageManager$LockBasedLazyValue.invoke(LockBasedStorageManager.java:370)
	at kotlin.reflect.jvm.internal.impl.storage.LockBasedStorageManager$LockBasedNotNullLazyValue.invoke(LockBasedStorageManager.java:489)
	at kotlin.reflect.jvm.internal.impl.storage.StorageKt.getValue(storage.kt:42)
	at kotlin.reflect.jvm.internal.impl.descriptors.impl.LazyPackageViewDescriptorImpl.getFragments(LazyPackageViewDescriptorImpl.kt)
	at kotlin.reflect.jvm.internal.impl.descriptors.impl.LazyPackageViewDescriptorImpl$memberScope$1.invoke(LazyPackageViewDescriptorImpl.kt:41)
	at kotlin.reflect.jvm.internal.impl.descriptors.impl.LazyPackageViewDescriptorImpl$memberScope$1.invoke(LazyPackageViewDescriptorImpl.kt:30)
	at kotlin.reflect.jvm.internal.impl.resolve.scopes.LazyScopeAdapter$lazyScope$1.invoke(LazyScopeAdapter.kt:28)
	at kotlin.reflect.jvm.internal.impl.resolve.scopes.LazyScopeAdapter$lazyScope$1.invoke(LazyScopeAdapter.kt:22)
	at kotlin.reflect.jvm.internal.impl.storage.LockBasedStorageManager$LockBasedLazyValue.invoke(LockBasedStorageManager.java:370)
	at kotlin.reflect.jvm.internal.impl.storage.LockBasedStorageManager$LockBasedNotNullLazyValue.invoke(LockBasedStorageManager.java:489)
	at kotlin.reflect.jvm.internal.impl.resolve.scopes.LazyScopeAdapter.getWorkerScope(LazyScopeAdapter.kt:34)
	at kotlin.reflect.jvm.internal.impl.resolve.scopes.AbstractScopeAdapter.getContributedClassifier(AbstractScopeAdapter.kt:44)
	at kotlin.reflect.jvm.internal.impl.descriptors.FindClassInModuleKt.findClassifierAcrossModuleDependencies(findClassInModule.kt:26)
	at kotlin.reflect.jvm.internal.impl.serialization.deserialization.TypeDeserializer.computeClassifierDescriptor(TypeDeserializer.kt:240)
	at kotlin.reflect.jvm.internal.impl.serialization.deserialization.TypeDeserializer.access$computeClassifierDescriptor(TypeDeserializer.kt:23)
	at kotlin.reflect.jvm.internal.impl.serialization.deserialization.TypeDeserializer$classifierDescriptors$1.invoke(TypeDeserializer.kt:33)
	at kotlin.reflect.jvm.internal.impl.serialization.deserialization.TypeDeserializer$classifierDescriptors$1.invoke(TypeDeserializer.kt:23)
	at kotlin.reflect.jvm.internal.impl.storage.LockBasedStorageManager$MapBasedMemoizedFunction.invoke(LockBasedStorageManager.java:527)
	at kotlin.reflect.jvm.internal.impl.serialization.deserialization.TypeDeserializer.typeConstructor(TypeDeserializer.kt:132)
	at kotlin.reflect.jvm.internal.impl.serialization.deserialization.TypeDeserializer.simpleType(TypeDeserializer.kt:76)
	at kotlin.reflect.jvm.internal.impl.serialization.deserialization.TypeDeserializer.type(TypeDeserializer.kt:64)
	at kotlin.reflect.jvm.internal.impl.serialization.deserialization.descriptors.DeserializedClassDescriptor$DeserializedClassTypeConstructor.computeSupertypes(DeserializedClassDescriptor.kt:190)
	at kotlin.reflect.jvm.internal.impl.types.AbstractTypeConstructor$supertypes$1.invoke(AbstractTypeConstructor.kt:80)
	at kotlin.reflect.jvm.internal.impl.types.AbstractTypeConstructor$supertypes$1.invoke(AbstractTypeConstructor.kt:26)
	at kotlin.reflect.jvm.internal.impl.storage.LockBasedStorageManager$LockBasedLazyValue.invoke(LockBasedStorageManager.java:370)
	at kotlin.reflect.jvm.internal.impl.storage.LockBasedStorageManager$LockBasedLazyValueWithPostCompute.invoke(LockBasedStorageManager.java:443)
	at kotlin.reflect.jvm.internal.impl.storage.LockBasedStorageManager$LockBasedNotNullLazyValueWithPostCompute.invoke(LockBasedStorageManager.java:474)
	at kotlin.reflect.jvm.internal.impl.types.AbstractTypeConstructor.getSupertypes(AbstractTypeConstructor.kt:27)
	at kotlin.reflect.jvm.internal.impl.types.AbstractTypeConstructor.getSupertypes(AbstractTypeConstructor.kt:26)
	at kotlin.reflect.jvm.internal.KClassImpl$Data$supertypes$2.invoke(KClassImpl.kt:124)
	at kotlin.reflect.jvm.internal.KClassImpl$Data$supertypes$2.invoke(KClassImpl.kt:46)
	at kotlin.reflect.jvm.internal.ReflectProperties$LazySoftVal.invoke(ReflectProperties.java:92)
	at kotlin.reflect.jvm.internal.ReflectProperties$Val.getValue(ReflectProperties.java:31)
	at kotlin.reflect.jvm.internal.KClassImpl$Data.getSupertypes(KClassImpl.kt)
	at kotlin.reflect.jvm.internal.KClassImpl.getSupertypes(KClassImpl.kt:253)
	at kotlin.reflect.full.KClasses.getSuperclasses(KClasses.kt:185)
	at kotlin.reflect.full.KClasses$isSubclassOf$1.get(KClasses.kt:234)
	at kotlin.jvm.internal.PropertyReference1.invoke(PropertyReference1.java:35)
	at kotlin.reflect.full.KClasses$sam$org_jetbrains_kotlin_utils_DFS_Neighbors$0.getNeighbors(KClasses.kt)
	at kotlin.reflect.jvm.internal.impl.utils.DFS.doDfs(DFS.java:98)
	at kotlin.reflect.jvm.internal.impl.utils.DFS.dfs(DFS.java:27)
	at kotlin.reflect.jvm.internal.impl.utils.DFS.dfs(DFS.java:37)
	at kotlin.reflect.jvm.internal.impl.utils.DFS.ifAny(DFS.java:47)
	at kotlin.reflect.full.KClasses.isSubclassOf(KClasses.kt:234)
	at io.fluidsonic.raptor.DefaultRaptorDIBuilder.validateType(DefaultRaptorDIBuilder.kt:39)
	at io.fluidsonic.raptor.DefaultRaptorDIBuilder.provide(DefaultRaptorDIBuilder.kt:20)
	at io.fluidsonic.raptor.BsonRaptorFeature$beginConfiguration$1$1.invoke(BsonRaptorFeature.kt:44)
	at io.fluidsonic.raptor.BsonRaptorFeature$beginConfiguration$1$1.invoke(BsonRaptorFeature.kt:7)
	at io.fluidsonic.raptor.RaptorDIFeatureKt$di$1.invoke(RaptorDIFeature.kt:21)
	at io.fluidsonic.raptor.RaptorDIFeatureKt$di$1.invoke(RaptorDIFeature.kt)
	at io.fluidsonic.raptor.DefaultRaptorComponentRegistry$RegistrationSet.configure(DefaultRaptorComponentRegistry.kt:177)
	at io.fluidsonic.raptor.RaptorComponentRegistryKt.configure(RaptorComponentRegistry.kt:29)
	at io.fluidsonic.raptor.RaptorDIFeatureKt.di(RaptorDIFeature.kt:20)
	at io.fluidsonic.raptor.BsonRaptorFeature$beginConfiguration$1.invoke(BsonRaptorFeature.kt:21)
	at io.fluidsonic.raptor.BsonRaptorFeature$beginConfiguration$1.invoke(BsonRaptorFeature.kt:7)
	at io.fluidsonic.raptor.RaptorFeatureInstallCheckScopeKt$ifInstalled$$inlined$with$lambda$1.invoke(RaptorFeatureInstallCheckScope.kt:14)
	at io.fluidsonic.raptor.RaptorFeatureInstallCheckScopeKt$ifInstalled$$inlined$with$lambda$1.invoke(RaptorFeatureInstallCheckScope.kt)
	at io.fluidsonic.raptor.DefaultRaptorRootComponent.applyLazyFeatureConfigurations(DefaultRaptorRootComponent.kt:28)
	at io.fluidsonic.raptor.DefaultRaptorRootComponent.install(DefaultRaptorRootComponent.kt:67)
	at io.fluidsonic.raptor.RaptorQuickstartFeature.beginConfiguration(RaptorQuickstartFeature.kt:13)
	at io.fluidsonic.raptor.DefaultRaptorRootComponent.install(DefaultRaptorRootComponent.kt:64)
	at edis.MainRaptorKt$mainRaptor$1.invoke(MainRaptor.kt:12)
	at edis.MainRaptorKt$mainRaptor$1.invoke(MainRaptor.kt)
	at io.fluidsonic.raptor.RaptorKt.raptor(Raptor.kt:25)
	at edis.MainRaptorKt.mainRaptor(MainRaptor.kt:9)
	at edis.MainKt.main(Main.kt:64)
	at edis.MainKt$$$main.invoke(Unknown Source)
	at kotlin.coroutines.intrinsics.IntrinsicsKt__IntrinsicsJvmKt$createCoroutineUnintercepted$$inlined$createCoroutineFromSuspendFunction$IntrinsicsKt__IntrinsicsJvmKt$1.invokeSuspend(IntrinsicsJvm.kt:205)
	at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
	at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:115)
	at kotlin.coroutines.jvm.internal.RunSuspendKt.runSuspend(RunSuspend.kt:19)
	at edis.MainKt.main(Main.kt)
dkhalanskyjb added a commit that referenced this issue Oct 26, 2020
@dkhalanskyjb
Copy link
Collaborator

Good suggestion.

Partially solved via #2331. The reflection API is large, and it would be difficult to ensure that all the cases are covered, so, given that simple examples work at least, it's probably better to roll out the partial solution and fix other issues as they surface.

I'm closing this issue for now, but feel free to reopen it in case some other false positives arise.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants