Skip to content

Commit f49f486

Browse files
authored
Merge pull request #563 from Nizernizer/fix/deadlock
fix: agent deadlock.
2 parents c5817d5 + e9ba653 commit f49f486

File tree

2 files changed

+38
-17
lines changed

2 files changed

+38
-17
lines changed

dongtai-core/src/main/java/io/dongtai/iast/core/bytecode/IastClassFileTransformer.java

Lines changed: 35 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,13 @@ public static IastClassFileTransformer getInstance(Instrumentation inst, PolicyM
6262
return INSTANCE;
6363
}
6464

65+
public static IastClassFileTransformer getInstance() {
66+
if (null != INSTANCE) {
67+
return INSTANCE;
68+
}
69+
return null;
70+
}
71+
6572
IastClassFileTransformer(Instrumentation inst, PolicyManager policyManager) {
6673
this.inst = inst;
6774
this.isDumpClass = EngineManager.getInstance().isEnableDumpClass();
@@ -112,29 +119,39 @@ public byte[] transform(final ClassLoader loader,
112119
final Class<?> classBeingRedefined,
113120
final ProtectionDomain protectionDomain,
114121
final byte[] srcByteCodeArray) {
122+
String threadName = Thread.currentThread().getName();
123+
if (threadName.startsWith("DongTai-IAST-Core")
124+
|| threadName.startsWith("DongTai-IAST-AgentStateMonitor")
125+
|| threadName.startsWith("DongTai-IAST-ConfigMonitor")
126+
|| threadName.startsWith("DongTai-IAST-FallbackConfigMonitor")
127+
|| threadName.startsWith("DongTai-IAST-HearBeatMonitor")
128+
|| threadName.startsWith("DongTai-IAST-PerformanceMonitor")) {
129+
return null;
130+
}
131+
132+
if (internalClassName == null
133+
|| internalClassName.startsWith("io/dongtai/")
134+
|| internalClassName.startsWith("com/secnium/iast/")
135+
|| internalClassName.startsWith("java/lang/iast/")
136+
|| internalClassName.startsWith("cn/huoxian/iast/")
137+
|| internalClassName.startsWith("META-INF/")
138+
|| "module-info".equals(internalClassName)) {
139+
return null;
140+
}
141+
142+
if (null != loader && loader.toString().toLowerCase().contains("rasp")) {
143+
return null;
144+
}
145+
115146
try {
116147
ScopeManager.SCOPE_TRACKER.getPolicyScope().enterAgent();
117148

118-
if (internalClassName == null
119-
|| internalClassName.startsWith("io/dongtai/")
120-
|| internalClassName.startsWith("com/secnium/iast/")
121-
|| internalClassName.startsWith("java/lang/iast/")
122-
|| internalClassName.startsWith("cn/huoxian/iast/")
123-
|| internalClassName.startsWith("META-INF/")
124-
|| "module-info".equals(internalClassName)) {
125-
return null;
126-
}
127-
128149
if (" com/alibaba/fastjson/JSON".substring(1).equals(internalClassName)) {
129150
FastjsonCheck.setJsonClassLoader(loader);
130151
} else if (" com/alibaba/fastjson/parser/ParserConfig".substring(1).equals(internalClassName)) {
131152
FastjsonCheck.setParseConfigClassLoader(loader);
132153
}
133154

134-
if (null != loader && loader.toString().toLowerCase().contains("rasp")) {
135-
return null;
136-
}
137-
138155
if (loader != null && protectionDomain != null) {
139156
final CodeSource codeSource = protectionDomain.getCodeSource();
140157
if (codeSource == null) {
@@ -156,7 +173,6 @@ public byte[] transform(final ClassLoader loader,
156173

157174
ClassContext classContext = new ClassContext(cr, loader);
158175
if (Modifier.isInterface(classContext.getModifier())) {
159-
sourceCodeBak = null;
160176
return null;
161177
}
162178
final String className = classContext.getClassName();
@@ -186,11 +202,9 @@ public byte[] transform(final ClassLoader loader,
186202
return dumpClassIfNecessary(cr.getClassName(), cw.toByteArray(), srcByteCodeArray);
187203
}
188204
}
189-
sourceCodeBak = null;
190205
} catch (Throwable throwable) {
191206
DongTaiLog.warn(ErrorCode.get("TRANSFORM_CLASS_FAILED"), internalClassName, throwable);
192207
} finally {
193-
classDiagram.setLoader(null);
194208
ScopeManager.SCOPE_TRACKER.getPolicyScope().leaveAgent();
195209
}
196210

@@ -347,5 +361,9 @@ public void reTransform() {
347361
public static HashMap<Object, byte[]> getTransformMap() {
348362
return transformMap;
349363
}
364+
365+
public IastClassDiagram getClassDiagram() {
366+
return classDiagram;
367+
}
350368
}
351369

dongtai-core/src/main/java/io/dongtai/iast/core/init/impl/TransformEngine.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,9 @@ public void destroy() {
7373
DongTaiLog.error(ErrorCode.get("TRANSFORM_ENGINE_DESTROY_REDEFINE_CLASSES_FAILED"), e);
7474
}
7575
}
76+
if (IastClassFileTransformer.getInstance() != null) {
77+
IastClassFileTransformer.getInstance().getClassDiagram().setLoader(null);
78+
}
7679
inst = null;
7780
classFileTransformer = null;
7881
}

0 commit comments

Comments
 (0)