Skip to content

Commit 3c66582

Browse files
committed
Dev: fix null pointer access to SwiftReference after release
1 parent d2f4b4d commit 3c66582

File tree

9 files changed

+46
-13
lines changed

9 files changed

+46
-13
lines changed

compiler/src/main/java/com/readdle/codegen/SwiftBlockDescriptor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,7 @@ File generateCode() throws IOException {
212212
swiftWriter.emitStatement("}");
213213
}
214214
else {
215-
swiftWriter.emitStatement("fatalError(\"\\(javaThrowable.className()): \\(javaThrowable.getMessage())\\(javaThrowable.stackTraceString())\")");
215+
swiftWriter.emitStatement("fatalError(\"\\(javaThrowable.className()): \\(javaThrowable.getMessage() ?? \"\")\\(javaThrowable.stackTraceString())\")");
216216
}
217217
swiftWriter.emitStatement("}");
218218

compiler/src/main/java/com/readdle/codegen/SwiftCallbackFuncDescriptor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,7 @@ void generateCode(SwiftWriter swiftWriter, String javaFullName, String swiftType
203203
swiftWriter.emitStatement("}");
204204
}
205205
else {
206-
swiftWriter.emitStatement("fatalError(\"\\(javaThrowable.className()): \\(javaThrowable.getMessage())\\(javaThrowable.stackTraceString())\")");
206+
swiftWriter.emitStatement("fatalError(\"\\(javaThrowable.className()): \\(javaThrowable.getMessage() ?? \"\")\\(javaThrowable.stackTraceString())\")");
207207
}
208208
swiftWriter.emitStatement("}");
209209

compiler/src/main/java/com/readdle/codegen/SwiftDelegateDescriptor.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,8 @@ File generateCode() throws IOException {
214214
swiftWriter.emitEmptyLine();
215215
swiftWriter.emitStatement("// Get swift object from pointer");
216216
swiftWriter.emitStatement(String.format("public static func from(javaObject: jobject) throws -> %s {", simpleTypeName));
217-
swiftWriter.emitStatement("guard let pointer = UnsafeRawPointer(bitPattern: Int(JNI.api.GetLongField(JNI.env, javaObject, javaSwiftPointerFiled))) else {\nthrow NSError(domain: \"NullPointerException\", code: 1)\n}");
217+
swiftWriter.emitStatement("let longPointer = JNI.api.GetLongField(JNI.env, javaObject, javaSwiftPointerFiled)");
218+
swiftWriter.emitStatement("guard longPointer != 0, let pointer = UnsafeRawPointer(bitPattern: Int(longPointer)) else {\nthrow NSError(domain: \"java.lang.NullPointerException\", code: 1)\n}");
218219
swiftWriter.emitStatement(String.format("return Unmanaged<%s>.fromOpaque(pointer).takeUnretainedValue()", simpleTypeName));
219220
swiftWriter.emitStatement("}");
220221

compiler/src/main/java/com/readdle/codegen/SwiftFuncDescriptor.java

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,9 @@ public void generateCode(SwiftWriter swiftWriter, String javaFullName, String sw
129129
if (shouldCatchPreamble) {
130130
swiftWriter.emitStatement("}");
131131
swiftWriter.emitStatement("catch {");
132-
swiftWriter.emitStatement("let errorString = String(reflecting: type(of: error)) + String(describing: error)");
132+
swiftWriter.emitStatement("let errorString: String");
133+
swiftWriter.emitStatement("if let nsError = error as? NSError { errorString = \"\\(nsError.domain): \\(nsError.code)\" }");
134+
swiftWriter.emitStatement("else { errorString = String(reflecting: type(of: error)) + \": \" + String(describing: error) }");
133135
swiftWriter.emitStatement("_ = JNI.api.ThrowNew(JNI.env, SwiftRuntimeErrorClass, errorString)");
134136
swiftWriter.emitStatement(String.format("return%s", returnSwiftType != null ? " nil" : ""));
135137
swiftWriter.emitStatement("}");
@@ -161,6 +163,10 @@ public void generateCode(SwiftWriter swiftWriter, String javaFullName, String sw
161163
}
162164
swiftWriter.emit(")\n");
163165

166+
if (swiftMethodName.equals("release")) {
167+
swiftWriter.emitStatement("JNI.api.SetLongField(JNI.env, this, javaSwiftPointerFiled, 0)");
168+
}
169+
164170
if (returnSwiftType != null) {
165171
swiftWriter.emitStatement("do {");
166172
if (isReturnTypeOptional) {
@@ -171,7 +177,9 @@ public void generateCode(SwiftWriter swiftWriter, String javaFullName, String sw
171177
}
172178
swiftWriter.emitStatement("}");
173179
swiftWriter.emitStatement("catch {");
174-
swiftWriter.emitStatement("let errorString = String(reflecting: type(of: error)) + String(describing: error)");
180+
swiftWriter.emitStatement("let errorString: String");
181+
swiftWriter.emitStatement("if let nsError = error as? NSError { errorString = \"\\(nsError.domain): \\(nsError.code)\" }");
182+
swiftWriter.emitStatement("else { errorString = String(reflecting: type(of: error)) + \": \" + String(describing: error) }");
175183
swiftWriter.emitStatement("_ = JNI.api.ThrowNew(JNI.env, SwiftRuntimeErrorClass, errorString)");
176184
swiftWriter.emitStatement("return nil");
177185
swiftWriter.emitStatement("}");
@@ -180,7 +188,9 @@ public void generateCode(SwiftWriter swiftWriter, String javaFullName, String sw
180188
if (isThrown) {
181189
swiftWriter.emitStatement("}");
182190
swiftWriter.emitStatement("catch {");
183-
swiftWriter.emitStatement("let errorString = String(reflecting: type(of: error)) + String(describing: error)");
191+
swiftWriter.emitStatement("let errorString: String");
192+
swiftWriter.emitStatement("if let nsError = error as? NSError { errorString = \"\\(nsError.domain): \\(nsError.code)\" }");
193+
swiftWriter.emitStatement("else { errorString = String(reflecting: type(of: error)) + \": \" + String(describing: error) }");
184194
swiftWriter.emitStatement("_ = JNI.api.ThrowNew(JNI.env, SwiftErrorClass, errorString)");
185195
swiftWriter.emitStatement(String.format("return%s", returnSwiftType != null ? " nil" : ""));
186196
swiftWriter.emitStatement("}");

compiler/src/main/java/com/readdle/codegen/SwiftGetterDescriptor.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,9 @@ public void generateCode(SwiftWriter swiftWriter, String javaFullName, String sw
6161
swiftWriter.emitStatement(String.format("swiftSelf = try %s.from(javaObject: this)", swiftType));
6262
swiftWriter.emitStatement("}");
6363
swiftWriter.emitStatement("catch {");
64-
swiftWriter.emitStatement("let errorString = String(reflecting: type(of: error)) + String(describing: error)");
64+
swiftWriter.emitStatement("let errorString: String");
65+
swiftWriter.emitStatement("if let nsError = error as? NSError { errorString = \"\\(nsError.domain): \\(nsError.code)\" }");
66+
swiftWriter.emitStatement("else { errorString = String(reflecting: type(of: error)) + \": \" + String(describing: error) }");
6567
swiftWriter.emitStatement("_ = JNI.api.ThrowNew(JNI.env, SwiftRuntimeErrorClass, errorString)");
6668
swiftWriter.emitStatement(String.format("return%s", returnSwiftType != null ? " nil" : ""));
6769
swiftWriter.emitStatement("}");
@@ -79,7 +81,9 @@ public void generateCode(SwiftWriter swiftWriter, String javaFullName, String sw
7981
}
8082
swiftWriter.emitStatement("}");
8183
swiftWriter.emitStatement("catch {");
82-
swiftWriter.emitStatement("let errorString = String(reflecting: type(of: error)) + String(describing: error)");
84+
swiftWriter.emitStatement("let errorString: String");
85+
swiftWriter.emitStatement("if let nsError = error as? NSError { errorString = \"\\(nsError.domain): \\(nsError.code)\" }");
86+
swiftWriter.emitStatement("else { errorString = String(reflecting: type(of: error)) + \": \" + String(describing: error) }");
8387
swiftWriter.emitStatement("_ = JNI.api.ThrowNew(JNI.env, SwiftRuntimeErrorClass, errorString)");
8488
swiftWriter.emitStatement("return nil");
8589
swiftWriter.emitStatement("}");

compiler/src/main/java/com/readdle/codegen/SwiftReferenceDescriptor.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,8 @@ File generateCode() throws IOException {
144144
swiftWriter.emitEmptyLine();
145145
swiftWriter.emitStatement("// Get swift object from pointer");
146146
swiftWriter.emitStatement(String.format("public static func from(javaObject: jobject) throws -> %s {", simpleTypeName));
147-
swiftWriter.emitStatement("guard let pointer = UnsafeRawPointer(bitPattern: Int(JNI.api.GetLongField(JNI.env, javaObject, javaSwiftPointerFiled))) else {\nthrow NSError(domain: \"NullPointerException\", code: 1)\n}");
147+
swiftWriter.emitStatement("let longPointer = JNI.api.GetLongField(JNI.env, javaObject, javaSwiftPointerFiled)");
148+
swiftWriter.emitStatement("guard longPointer != 0, let pointer = UnsafeRawPointer(bitPattern: Int(longPointer)) else {\nthrow NSError(domain: \"java.lang.NullPointerException\", code: 1)\n}");
148149
swiftWriter.emitStatement(String.format("return Unmanaged<%s>.fromOpaque(pointer).takeUnretainedValue()", simpleTypeName));
149150
swiftWriter.emitStatement("}");
150151

compiler/src/main/java/com/readdle/codegen/SwiftSetterDescriptor.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,9 @@ public void generateCode(SwiftWriter swiftWriter, String javaFullName, String sw
8181

8282
swiftWriter.emitStatement("}");
8383
swiftWriter.emitStatement("catch {");
84-
swiftWriter.emitStatement("let errorString = String(reflecting: type(of: error)) + String(describing: error)");
84+
swiftWriter.emitStatement("let errorString: String");
85+
swiftWriter.emitStatement("if let nsError = error as? NSError { errorString = \"\\(nsError.domain): \\(nsError.code)\" }");
86+
swiftWriter.emitStatement("else { errorString = String(reflecting: type(of: error)) + \": \" + String(describing: error) }");
8587
swiftWriter.emitStatement("_ = JNI.api.ThrowNew(JNI.env, SwiftRuntimeErrorClass, errorString)");
8688
swiftWriter.emitStatement("return");
8789
swiftWriter.emitStatement("}");

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
GROUP=com.readdle.swift.java.codegen
2-
VERSION_NAME=0.6.12
2+
VERSION_NAME=0.6.14
33

44
org.gradle.jvmargs=-Xmx1536m

sample/src/androidTest/java/com/readdle/swiftjava/sample/SampleReferenceTest.java

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@
33
import android.support.annotation.NonNull;
44
import android.support.annotation.Nullable;
55
import android.support.test.runner.AndroidJUnit4;
6+
import android.util.Log;
67

78
import com.readdle.codegen.anotation.JavaSwift;
89
import com.readdle.codegen.anotation.SwiftError;
10+
import com.readdle.codegen.anotation.SwiftRuntimeError;
911
import com.readdle.swiftjava.sample.asbtracthierarhy.AbstractType;
1012

1113
import org.junit.After;
@@ -212,7 +214,7 @@ void onSetSampleValue(SampleValue value) {
212214
Assert.fail();
213215
}
214216
catch (Exception e) {
215-
Assert.assertTrue(e.getMessage().equals("Foundation.NSErrorThe operation could not be completed"));
217+
Assert.assertTrue(e.getMessage().equals("java.lang.IllegalArgumentException: 0"));
216218
}
217219
try {
218220
sampleReference.throwableFunc(sampleDelegateAndroid, false);
@@ -225,7 +227,7 @@ void onSetSampleValue(SampleValue value) {
225227
Assert.fail();
226228
}
227229
catch (Exception e) {
228-
Assert.assertTrue(e.getMessage().equals("Foundation.NSErrorThe operation could not be completed"));
230+
Assert.assertTrue(e.getMessage().equals("java.lang.IllegalArgumentException: 0"));
229231
}
230232
try {
231233
Assert.assertTrue(sampleReference.throwableFuncWithReturnType(sampleDelegateAndroid, false).equals("throwableFuncWithReturnType"));
@@ -235,4 +237,17 @@ void onSetSampleValue(SampleValue value) {
235237
}
236238
}
237239

240+
@Test
241+
public void testNullPointerAfterRelease() {
242+
SampleReference sampleReference = SampleReference.init();
243+
sampleReference.release();
244+
try {
245+
sampleReference.funcWithNil();
246+
Assert.fail();
247+
}
248+
catch (SwiftRuntimeError error) {
249+
Assert.assertTrue(error.getMessage().equals("java.lang.NullPointerException: 1"));
250+
}
251+
}
252+
238253
}

0 commit comments

Comments
 (0)