summaryrefslogtreecommitdiff
path: root/debian/patches/8141491.diff
diff options
context:
space:
mode:
Diffstat (limited to 'debian/patches/8141491.diff')
-rw-r--r--debian/patches/8141491.diff115
1 files changed, 115 insertions, 0 deletions
diff --git a/debian/patches/8141491.diff b/debian/patches/8141491.diff
new file mode 100644
index 0000000..6370c7c
--- /dev/null
+++ b/debian/patches/8141491.diff
@@ -0,0 +1,115 @@
+# DP: JDK-8141491: Unaligned memory access in Bits.c
+
+--- a/jdk/src/share/native/java/nio/Bits.c
++++ b/jdk/src/share/native/java/nio/Bits.c
+@@ -67,16 +67,38 @@
+ #define SWAPLONG(x) ((jlong)(((jlong)SWAPINT((jint)(x)) << 32) | \
+ ((jlong)SWAPINT((jint)((x) >> 32)) & 0xffffffff)))
+
++/* The destination buffer passed to Java_java_nio_Bits_copyFromShor<type>tArray
++ * function and the source buffer passed to Java_java_nio_Bits_copyTo<type>Array
++ * may not be aligned on <type>'s boundary. Inform the compiler about this via
++ * 'unaligned' attribute, provided it supports this attribute. For recent
++ * compilers, use __has_attribute preprocessor predicate; if it is not available,
++ * we know that GCC supports it.
++ */
++#ifndef __has_attribute
++#define __has_attribute(x) 0
++#endif
++
++#if defined(__GNUC__) || __has_attribute(aligned)
++typedef jshort __attribute__((aligned(1))) jshort_unaligned;
++typedef jint __attribute__((aligned(1))) jint_unaligned;
++typedef jlong __attribute__((aligned(1))) jlong_unaligned;
++#else
++typedef jshort jshort_unaligned;
++typedef jint jint_unaligned;
++typedef jlong jlong_unaligned;
++#endif
++
+ JNIEXPORT void JNICALL
+ Java_java_nio_Bits_copyFromShortArray(JNIEnv *env, jobject this, jobject src,
+ jlong srcPos, jlong dstAddr, jlong length)
+ {
+ jbyte *bytes;
+ size_t size;
+- jshort *srcShort, *dstShort, *endShort;
++ jshort *srcShort, *endShort;
++ jshort_unaligned *dstShort;
+ jshort tmpShort;
+
+- dstShort = (jshort *)jlong_to_ptr(dstAddr);
++ dstShort = (jshort_unaligned *)jlong_to_ptr(dstAddr);
+
+ while (length > 0) {
+ /* do not change this if-else statement, see WARNING above */
+@@ -108,10 +130,11 @@ Java_java_nio_Bits_copyToShortArray(JNIE
+ {
+ jbyte *bytes;
+ size_t size;
+- jshort *srcShort, *dstShort, *endShort;
++ jshort_unaligned *srcShort, *endShort;
++ jshort *dstShort;
+ jshort tmpShort;
+
+- srcShort = (jshort *)jlong_to_ptr(srcAddr);
++ srcShort = (jshort_unaligned *)jlong_to_ptr(srcAddr);
+
+ while (length > 0) {
+ /* do not change this if-else statement, see WARNING above */
+@@ -143,10 +166,11 @@ Java_java_nio_Bits_copyFromIntArray(JNIE
+ {
+ jbyte *bytes;
+ size_t size;
+- jint *srcInt, *dstInt, *endInt;
++ jint *srcInt, *endInt;
++ jint_unaligned *dstInt;
+ jint tmpInt;
+
+- dstInt = (jint *)jlong_to_ptr(dstAddr);
++ dstInt = (jint_unaligned *)jlong_to_ptr(dstAddr);
+
+ while (length > 0) {
+ /* do not change this code, see WARNING above */
+@@ -178,10 +202,11 @@ Java_java_nio_Bits_copyToIntArray(JNIEnv
+ {
+ jbyte *bytes;
+ size_t size;
+- jint *srcInt, *dstInt, *endInt;
++ jint_unaligned *srcInt, *endInt;
++ jint *dstInt;
+ jint tmpInt;
+
+- srcInt = (jint *)jlong_to_ptr(srcAddr);
++ srcInt = (jint_unaligned *)jlong_to_ptr(srcAddr);
+
+ while (length > 0) {
+ /* do not change this code, see WARNING above */
+@@ -213,10 +238,11 @@ Java_java_nio_Bits_copyFromLongArray(JNI
+ {
+ jbyte *bytes;
+ size_t size;
+- jlong *srcLong, *dstLong, *endLong;
++ jlong *srcLong, *endLong;
++ jlong_unaligned *dstLong;
+ jlong tmpLong;
+
+- dstLong = (jlong *)jlong_to_ptr(dstAddr);
++ dstLong = (jlong_unaligned *)jlong_to_ptr(dstAddr);
+
+ while (length > 0) {
+ /* do not change this code, see WARNING above */
+@@ -248,10 +274,11 @@ Java_java_nio_Bits_copyToLongArray(JNIEn
+ {
+ jbyte *bytes;
+ size_t size;
+- jlong *srcLong, *dstLong, *endLong;
++ jlong_unaligned *srcLong, *endLong;
++ jlong *dstLong;
+ jlong tmpLong;
+
+- srcLong = (jlong *)jlong_to_ptr(srcAddr);
++ srcLong = (jlong_unaligned *)jlong_to_ptr(srcAddr);
+
+ while (length > 0) {
+ /* do not change this code, see WARNING above */