Blame SOURCES/bz1622050-2-libgfs2_Fix_pointer_cast_byte_order_issue.patch

c48b4d
commit 57553571df2f33ec45a81fa5599873ddfc890c92
c48b4d
Author: Andrew Price <anprice@redhat.com>
c48b4d
Date:   Thu Sep 6 14:28:19 2018 +0100
c48b4d
c48b4d
    libgfs2: Fix pointer cast byte order issue
c48b4d
    
c48b4d
    lgfs2_field_assign() currently uses pointer casting to achieve generic
c48b4d
    integer assignment based on the width of the field, but this is broken
c48b4d
    as a uin32_t field can be assigned the value from the high bytes of the
c48b4d
    uint64_t value, for instance. To fix this, store the value into a
c48b4d
    uint64_t before casting to the narrower types.
c48b4d
    
c48b4d
    Signed-off-by: Andrew Price <anprice@redhat.com>
c48b4d
c48b4d
diff --git a/gfs2/libgfs2/meta.c b/gfs2/libgfs2/meta.c
c48b4d
index a8289466..e0ea4912 100644
c48b4d
--- a/gfs2/libgfs2/meta.c
c48b4d
+++ b/gfs2/libgfs2/meta.c
c48b4d
@@ -940,6 +940,7 @@ int lgfs2_field_str(char *str, const size_t size, const char *blk, const struct
c48b4d
 int lgfs2_field_assign(char *blk, const struct lgfs2_metafield *field, const void *val)
c48b4d
 {
c48b4d
 	char *fieldp = blk + field->offset;
c48b4d
+	uint64_t num = *(uint64_t *)val;
c48b4d
 
c48b4d
 	if (field->flags & LGFS2_MFF_UUID) {
c48b4d
 		memcpy(fieldp, val, 16);
c48b4d
@@ -959,16 +960,16 @@ int lgfs2_field_assign(char *blk, const struct lgfs2_metafield *field, const voi
c48b4d
 
c48b4d
 	switch(field->length) {
c48b4d
 	case sizeof(uint8_t):
c48b4d
-		*fieldp = *(uint8_t *)val;
c48b4d
+		*fieldp = (uint8_t)num;
c48b4d
 		return 0;
c48b4d
 	case sizeof(uint16_t):
c48b4d
-		*(uint16_t *)fieldp = cpu_to_be16(*(uint16_t *)val);
c48b4d
+		*(uint16_t *)fieldp = cpu_to_be16((uint16_t)num);
c48b4d
 		return 0;
c48b4d
 	case sizeof(uint32_t):
c48b4d
-		*(uint32_t *)fieldp = cpu_to_be32(*(uint32_t *)val);
c48b4d
+		*(uint32_t *)fieldp = cpu_to_be32((uint32_t)num);
c48b4d
 		return 0;
c48b4d
 	case sizeof(uint64_t):
c48b4d
-		*(uint64_t *)fieldp = cpu_to_be64(*(uint64_t *)val);
c48b4d
+		*(uint64_t *)fieldp = cpu_to_be64((uint64_t)num);
c48b4d
 		return 0;
c48b4d
 	default:
c48b4d
 		/* Will never happen */