krb5 commit [krb5-1.13]: Avoid unaligned access in btree byte swapping

Tom Yu tlyu at mit.edu
Fri Sep 9 14:48:21 EDT 2016


https://github.com/krb5/krb5/commit/c462695d606c7d3ca042297a043f37d049f097ff
commit c462695d606c7d3ca042297a043f37d049f097ff
Author: Tom Yu <tlyu at mit.edu>
Date:   Fri Aug 26 13:56:18 2016 -0400

    Avoid unaligned access in btree byte swapping
    
    Apply a patch from NetBSD to use temporary character buffers instead
    of doing an unaligned read when swapping bytes.
    
    (cherry picked from commit 0936b2578b64be2c53c8cfccd70cbe93519d42fa)
    
    ticket: 8484
    version_fixed: 1.13.7

 src/plugins/kdb/db2/libdb2/include/db-int.h |   22 ++++++++++++++--------
 1 files changed, 14 insertions(+), 8 deletions(-)

diff --git a/src/plugins/kdb/db2/libdb2/include/db-int.h b/src/plugins/kdb/db2/libdb2/include/db-int.h
index 0dcbf40..7e981d4 100644
--- a/src/plugins/kdb/db2/libdb2/include/db-int.h
+++ b/src/plugins/kdb/db2/libdb2/include/db-int.h
@@ -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];				\


More information about the cvs-krb5 mailing list