Skip to content

Commit de9a903

Browse files
committed
Prevent NREX when instantiating Java.Lang.StackTraceElement
Context: #8788 (comment) Context: https://developer.android.com/reference/java/lang/StackTraceElement?hl=en#StackTraceElement(java.lang.String,%20java.lang.String,%20java.lang.String,%20int) `Java.Lang.StackTraceElement` constructor requires the `declaringClass` and `methodName` parameters to never be `null`. Pass the string `Unknown` whenever any of this information is missing from the managed stack frame. Additionally, the `lineNumber` parameter is now set to `-2` if we think a stack frame points to native code.
1 parent 68b1b91 commit de9a903

File tree

1 file changed

+16
-3
lines changed

1 file changed

+16
-3
lines changed

src/Mono.Android/Android.Runtime/JavaProxyThrowable.cs

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,15 +66,28 @@ void TranslateStackTrace ()
6666
int nElements = frames.Length + (javaTrace?.Length ?? 0);
6767
StackTraceElement[] elements = new StackTraceElement[nElements];
6868

69+
const string Unknown = "Unknown";
6970
for (int i = 0; i < frames.Length; i++) {
7071
StackFrame managedFrame = frames[i];
7172
MethodBase? managedMethod = StackFrameGetMethod (managedFrame);
7273

74+
// https://developer.android.com/reference/java/lang/StackTraceElement?hl=en#StackTraceElement(java.lang.String,%20java.lang.String,%20java.lang.String,%20int)
75+
int lineNumber;
76+
if (managedFrame != null) {
77+
lineNumber = managedFrame.GetFileLineNumber ();
78+
if (lineNumber == 0) {
79+
// -2 means it's a native frame
80+
lineNumber = managedFrame.HasNativeImage () ? -2 : -1;
81+
}
82+
} else {
83+
lineNumber = -1;
84+
}
85+
7386
var throwableFrame = new StackTraceElement (
74-
declaringClass: managedMethod?.DeclaringType?.FullName,
75-
methodName: managedMethod?.Name,
87+
declaringClass: managedMethod?.DeclaringType?.FullName ?? Unknown,
88+
methodName: managedMethod?.Name ?? Unknown,
7689
fileName: managedFrame?.GetFileName (),
77-
lineNumber: managedFrame?.GetFileLineNumber () ?? -1
90+
lineNumber: lineNumber
7891
);
7992

8093
elements[i] = throwableFrame;

0 commit comments

Comments
 (0)