Unsafe was changed recently through: https://github.com/openjdk/jdk/pull/31249 
to no longer treat any non-zero byte read as a `boolean` through Unsafe as 
`true`, but only treat the 'canonical' representation, where only the least 
significant bit in the byte is set, as `true`.

This change inadvertently leaked out through the memory access var handles. A 
user can write a `byte` into a memory segment (on or off-heap), and then read 
it back as a `boolean`, making this behavior change observable. Since the 
fallback linker depends on the previous behavior in the implementation, the 
tier5 test from the title was failing. But, there is really a gap in testing 
here, and we can observe the difference in behavior when just using the memory 
access parts of the API as well.

It is important that the normalization of boolean values is the same in all 
these scenarios:
- Normalizing a value returned from native code by a downcall
- Normalizing an argument passed by native code to an upcall stub
- Normalizing a value read from a memory segment using a var handle or the 
MemorySegment::get accessor

To that end, this patch tweaks the memory segment var handles for boolean 
access to restore the old normalization behavior. I've also added the missing 
testing for this case.

---------
- [x] I confirm that I make this contribution in accordance with the [OpenJDK 
Interim AI Policy](https://openjdk.org/legal/ai).

-------------

Commit messages:
 - Cleanup
 - Add more thorough testing
 - Adapt segment view var handles instead
 - Adapt boolean memaccess var handles to restore old normilzation behavior

Changes: https://git.openjdk.org/jdk/pull/31727/files
  Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=31727&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8386848
  Stats: 166 lines in 4 files changed: 105 ins; 58 del; 3 mod
  Patch: https://git.openjdk.org/jdk/pull/31727.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/31727/head:pull/31727

PR: https://git.openjdk.org/jdk/pull/31727

Reply via email to