diff options
Diffstat (limited to 'debian/patches/8141491.diff')
-rw-r--r-- | debian/patches/8141491.diff | 115 |
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 */ |