]> git.ipfire.org Git - thirdparty/krb5.git/commitdiff
Avoid unaligned access in btree byte swapping
authorTom Yu <tlyu@mit.edu>
Fri, 26 Aug 2016 17:56:18 +0000 (13:56 -0400)
committerTom Yu <tlyu@mit.edu>
Mon, 29 Aug 2016 19:46:29 +0000 (15:46 -0400)
Apply a patch from NetBSD to use temporary character buffers instead
of doing an unaligned read when swapping bytes.

ticket: 8484 (new)
target_version: 1.14-next
target_version: 1.13-next
tags: pullup

src/plugins/kdb/db2/libdb2/include/db-int.h

index 0dcbf40b65dc750a20e5f7b031bfba271c7e51d7..7e981d4a5fc30976960343b1ad6cc02e869436f0 100644 (file)
@@ -160,11 +160,15 @@ typedef u_int32_t recno_t;
        ((char *)&a)[3] = ((char *)&_tmp)[0];                           \
 }
 #define        P_32_SWAP(a) {                                                  \
-       u_int32_t _tmp = *(u_int32_t *)a;                               \
-       ((char *)a)[0] = ((char *)&_tmp)[3];                            \
-       ((char *)a)[1] = ((char *)&_tmp)[2];                            \
-       ((char *)a)[2] = ((char *)&_tmp)[1];                            \
-       ((char *)a)[3] = ((char *)&_tmp)[0];                            \
+       char _tmp[4];                                                   \
+       _tmp[0] = ((char *)a)[0];                                       \
+       _tmp[1] = ((char *)a)[1];                                       \
+       _tmp[2] = ((char *)a)[2];                                       \
+       _tmp[3] = ((char *)a)[3];                                       \
+       ((char *)a)[0] = _tmp[3];                                       \
+       ((char *)a)[1] = _tmp[2];                                       \
+       ((char *)a)[2] = _tmp[1];                                       \
+       ((char *)a)[3] = _tmp[0];                                       \
 }
 #define        P_32_COPY(a, b) {                                               \
        ((char *)&(b))[0] = ((char *)&(a))[3];                          \
@@ -185,9 +189,11 @@ typedef u_int32_t  recno_t;
        ((char *)&a)[1] = ((char *)&_tmp)[0];                           \
 }
 #define        P_16_SWAP(a) {                                                  \
-       u_int16_t _tmp = *(u_int16_t *)a;                               \
-       ((char *)a)[0] = ((char *)&_tmp)[1];                            \
-       ((char *)a)[1] = ((char *)&_tmp)[0];                            \
+       char _tmp[2];                                                   \
+       _tmp[0] = ((char *)a)[0];                                       \
+       _tmp[1] = ((char *)a)[1];                                       \
+       ((char *)a)[0] = _tmp[1];                                       \
+       ((char *)a)[1] = _tmp[0];                                       \
 }
 #define        P_16_COPY(a, b) {                                               \
        ((char *)&(b))[0] = ((char *)&(a))[1];                          \