From 451daaa7c5036a6f3d0da34602ee6e0e0020a492 Mon Sep 17 00:00:00 2001 From: Vladimir Dolzhenko Date: Wed, 10 May 2023 11:40:44 +0000 Subject: [PATCH] Do not publish non fully initialized descriptors Leaking of a reference (via publishing to binding trace) of not fully initialized object could lead to unpredicted and unexpected NPEs iff some exception (like PCE or InvalidPsiAccess) happens between the publishing and initialization. #KT-57514 #KT-56388 #KT-56364 Merge-request: KT-MR-10052 Merged-by: Vladimir Dolzhenko --- .../src/org/jetbrains/kotlin/resolve/DescriptorResolver.java | 5 ++++- .../jetbrains/kotlin/resolve/FunctionDescriptorResolver.kt | 4 ++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DescriptorResolver.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DescriptorResolver.java index 365d875f311..090a730203c 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DescriptorResolver.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DescriptorResolver.java @@ -1241,7 +1241,6 @@ public class DescriptorResolver { getterType = determineGetterReturnType( scopeForDeclarationResolution, trace, getterDescriptor, getter, propertyTypeIfKnown, inferenceSession ); - trace.record(BindingContext.PROPERTY_ACCESSOR, getter, getterDescriptor); } else { getterDescriptor = DescriptorFactory.createGetter( @@ -1254,6 +1253,10 @@ public class DescriptorResolver { getterDescriptor.initialize(getterType != null ? getterType : VariableTypeAndInitializerResolver.getTypeForPropertyWithoutReturnType(propertyDescriptor.getName().asString())); + if (getter != null) { + trace.record(BindingContext.PROPERTY_ACCESSOR, getter, getterDescriptor); + } + return getterDescriptor; } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/FunctionDescriptorResolver.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/FunctionDescriptorResolver.kt index 1a43ce515f0..d3d864a8f1a 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/FunctionDescriptorResolver.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/FunctionDescriptorResolver.kt @@ -444,8 +444,6 @@ class FunctionDescriptorResolver( constructorDescriptor.isActual = modifierList?.hasActualModifier() == true || // We don't require 'actual' for constructors of actual annotations classDescriptor.kind == ClassKind.ANNOTATION_CLASS && classDescriptor.isActual - if (declarationToTrace is PsiElement) - trace.record(BindingContext.CONSTRUCTOR, declarationToTrace, constructorDescriptor) val parameterScope = LexicalWritableScope( scope, constructorDescriptor, @@ -466,6 +464,8 @@ class FunctionDescriptorResolver( if (DescriptorUtils.isAnnotationClass(classDescriptor)) { CompileTimeConstantUtils.checkConstructorParametersType(valueParameters, trace) } + if (declarationToTrace is PsiElement) + trace.record(BindingContext.CONSTRUCTOR, declarationToTrace, constructorDescriptor) return constructor }