diff --git a/CHANGES.md b/CHANGES.md index 2d900ee918..c7fd6bad70 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -15,6 +15,7 @@ Bug Fixes --------- * [#1452](https://github.com/java-native-access/jna/issues/1452): Fix memory allocation/handling for error message generation in native library code (`dispatch.c`) - [@matthiasblaesing](https://github.com/matthiasblaesing). * [#1460](https://github.com/java-native-access/jna/issues/1460): Fix win32 variant date conversion in DST offest window and with millisecond values - [@eranl](https://github.com/eranl). +* [#1472](https://github.com/java-native-access/jna/issues/1472): Fix incorrect bitmask in `c.s.j.Pointer#createConstant(int)` - [@dbwiddis](https://github.com/dbwiddis). Release 5.12.1 ============== diff --git a/contrib/platform/src/com/sun/jna/platform/win32/COM/util/ProxyObject.java b/contrib/platform/src/com/sun/jna/platform/win32/COM/util/ProxyObject.java index 1a403a39fc..85017e8c1e 100644 --- a/contrib/platform/src/com/sun/jna/platform/win32/COM/util/ProxyObject.java +++ b/contrib/platform/src/com/sun/jna/platform/win32/COM/util/ProxyObject.java @@ -189,7 +189,7 @@ public boolean equals(Object arg) { @Override public int hashCode() { long id = this.getUnknownId(); - return (int) ((id >>> 32) & 0xFFFFFFFF) + (int) (id & 0xFFFFFFFF); + return (int) ((id >>> 32) + (id & 0xFFFFFFFFL)); } @Override diff --git a/src/com/sun/jna/Pointer.java b/src/com/sun/jna/Pointer.java index 1f85885110..1a3fe5d60f 100644 --- a/src/com/sun/jna/Pointer.java +++ b/src/com/sun/jna/Pointer.java @@ -60,7 +60,7 @@ public static final Pointer createConstant(long peer) { systems. */ public static final Pointer createConstant(int peer) { - return new Opaque((long)peer & 0xFFFFFFFF); + return new Opaque(peer & 0xFFFFFFFFL); } /** Pointer value of the real native pointer. Use long to be 64-bit safe. @@ -112,7 +112,7 @@ public boolean equals(Object o) { @Override public int hashCode() { - return (int)((peer >>> 32) + (peer & 0xFFFFFFFF)); + return (int) ((peer >>> 32) + (peer & 0xFFFFFFFFL)); } diff --git a/test/com/sun/jna/PointerTest.java b/test/com/sun/jna/PointerTest.java index bce88fbf7b..a457b5f9c4 100644 --- a/test/com/sun/jna/PointerTest.java +++ b/test/com/sun/jna/PointerTest.java @@ -25,10 +25,11 @@ package com.sun.jna; +import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Modifier; -import java.lang.reflect.InvocationTargetException; import java.util.Arrays; + import junit.framework.TestCase; @@ -174,10 +175,13 @@ public void testReadPointerArray() { public void testCreateConstantPointer() { Pointer p = Pointer.createConstant(0xFFFFFFFF); - assertEquals("Wrong peer value", p.peer, 0xFFFFFFFF); + assertEquals("Wrong peer value", p.peer, 0xFFFFFFFFL); - p = Pointer.createConstant(-1); + p = Pointer.createConstant(-1L); assertEquals("Wrong peer value", p.peer, -1); + + p = Pointer.createConstant(0x80000000); + assertEquals("createConstant(int) should avoid setting any high bits", 0, Pointer.nativeValue(p) >>> 32); } public void testReadStringArrayNULLElement() {