Can access closed memory segment
Maurizio Cimadamore
maurizio.cimadamore at oracle.com
Tue Jun 18 08:52:54 UTC 2024
Thanks Remi, we'll take a look
Maurizio
On 18/06/2024 08:54, Remi Forax wrote:
> 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