8300275: SegmentScope.isAccessibleBy returning incorrect values

Reviewed-by: alanb, jvernee
diff --git a/src/java.base/share/classes/jdk/internal/foreign/MemorySessionImpl.java b/src/java.base/share/classes/jdk/internal/foreign/MemorySessionImpl.java
index 84fa0a5..f9addff 100644
--- a/src/java.base/share/classes/jdk/internal/foreign/MemorySessionImpl.java
+++ b/src/java.base/share/classes/jdk/internal/foreign/MemorySessionImpl.java
@@ -1,5 +1,5 @@
 /*
- *  Copyright (c) 2019, 2022, Oracle and/or its affiliates. All rights reserved.
+ *  Copyright (c) 2019, 2023, Oracle and/or its affiliates. All rights reserved.
  *  DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  *  This code is free software; you can redistribute it and/or modify it
@@ -183,7 +183,7 @@
     @Override
     public final boolean isAccessibleBy(Thread thread) {
         Objects.requireNonNull(thread);
-        return owner == thread;
+        return owner == null || owner == thread;
     }
 
     /**
diff --git a/test/jdk/java/foreign/TestSegments.java b/test/jdk/java/foreign/TestSegments.java
index 3363a61..f849c8c 100644
--- a/test/jdk/java/foreign/TestSegments.java
+++ b/test/jdk/java/foreign/TestSegments.java
@@ -1,5 +1,5 @@
 /*
- *  Copyright (c) 2019, 2022, Oracle and/or its affiliates. All rights reserved.
+ *  Copyright (c) 2019, 2023, Oracle and/or its affiliates. All rights reserved.
  *  DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  *  This code is free software; you can redistribute it and/or modify it
@@ -191,6 +191,25 @@
         assertFalse(segment.isReadOnly());
     }
 
+    @DataProvider(name = "scopes")
+    public Object[][] scopes() {
+        return new Object[][] {
+                { SegmentScope.auto(), false },
+                { SegmentScope.global(), false },
+                { Arena.openConfined().scope(), true },
+                { Arena.openShared().scope(), false }
+        };
+    }
+
+    @Test(dataProvider = "scopes")
+    public void testIsAccessibleBy(SegmentScope scope, boolean isConfined) {
+        assertTrue(scope.isAccessibleBy(Thread.currentThread()));
+        assertTrue(scope.isAccessibleBy(new Thread()) != isConfined);
+        MemorySegment segment = MemorySegment.ofAddress(0, 0, scope);
+        assertTrue(segment.scope().isAccessibleBy(Thread.currentThread()));
+        assertTrue(segment.scope().isAccessibleBy(new Thread()) != isConfined);
+    }
+
     @DataProvider(name = "segmentFactories")
     public Object[][] segmentFactories() {
         List<Supplier<MemorySegment>> l = List.of(
@@ -264,11 +283,9 @@
         thread.start();
         thread.join();
 
-        if (segment.scope().isAccessibleBy(Thread.currentThread())) {
+        if (!segment.scope().isAccessibleBy(Thread.currentThread())) {
             RuntimeException e = exception.get();
-            if (!(e instanceof IllegalStateException)) {
-                throw e;
-            }
+            throw e;
         } else {
             assertNull(exception.get());
         }