Can access closed memory segment
Remi Forax
forax at univ-mlv.fr
Tue Jun 18 07:54:35 UTC 2024
Hello,
I think i've found an issue in the current implementation of shared arena close(),
when closing the scope the VM only checks if the arena is on stack but the memory segment can be stored in a static final.
In the following code, i'm able to read the segment after the shared arena is closed.
public class SharedArenaCloseBug {
static final Arena SHARED = Arena.ofShared();
static final MemorySegment SEGMENT = SHARED.allocate(16);
static int STATE;
void run() {
for(;;) {
if (STATE == 0) {
var value = SEGMENT.get(ValueLayout.JAVA_BYTE, 0L);
if (value == 42) {
return;
}
}
}
}
public static void main(String[] args) throws InterruptedException {
var bug = new SharedArenaCloseBug();
var thread = new Thread(bug::run);
thread.start();
Thread.sleep(100);
STATE = 1;
System.out.println("state 1");
Thread.sleep(100);
System.out.println("close");
SEGMENT.set(ValueLayout.JAVA_BYTE, 0L, (byte) 42);
SHARED.close();
Thread.sleep(100);
System.out.println("state 0");
STATE = 0;
Thread.sleep(100);
System.out.println("join");
thread.join();
}
}
regards,
Rémi
More information about the panama-dev
mailing list