Skip to content

Commit 15325bb

Browse files
committed
[GR-55009] TruffleStrings: guard all native pointer accesses with a reachability fence on its containing object.
PullRequest: graal/18244
2 parents 9d02a10 + cc5d942 commit 15325bb

File tree

4 files changed

+735
-654
lines changed

4 files changed

+735
-654
lines changed

truffle/src/com.oracle.truffle.api.strings/src/com/oracle/truffle/api/strings/AbstractTruffleString.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@
5555
import static com.oracle.truffle.api.strings.TStringGuards.isValidFixedWidth;
5656
import static com.oracle.truffle.api.strings.TStringGuards.isValidMultiByte;
5757

58+
import java.lang.ref.Reference;
59+
5860
import com.oracle.truffle.api.CompilerDirectives;
5961
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
6062
import com.oracle.truffle.api.nodes.Node;
@@ -1460,6 +1462,12 @@ static final class NativePointer {
14601462
* the native pointer's lifetime depends on the pointer object's lifetime.
14611463
*/
14621464
private final Object pointerObject;
1465+
/**
1466+
* The raw native pointer.
1467+
* <p>
1468+
* NOTE: any use of this pointer must be guarded by a reachability fence on
1469+
* {@link #pointerObject}!
1470+
*/
14631471
final long pointer;
14641472
private byte[] bytes;
14651473
private volatile boolean byteArrayIsValid = false;
@@ -1498,8 +1506,12 @@ void materializeByteArray(Node node, int byteOffset, int byteLength, InlinedCond
14981506
if (bytes == null) {
14991507
bytes = new byte[byteLength];
15001508
}
1501-
TStringUnsafe.copyFromNative(pointer, byteOffset, bytes, 0, byteLength);
1502-
byteArrayIsValid = true;
1509+
try {
1510+
TStringUnsafe.copyFromNative(pointer, byteOffset, bytes, 0, byteLength);
1511+
byteArrayIsValid = true;
1512+
} finally {
1513+
Reference.reachabilityFence(pointerObject);
1514+
}
15031515
}
15041516
}
15051517

0 commit comments

Comments
 (0)