[U-Boot] [PATCH 1/1] lib: uuid: alignment error in gen_rand_uuid()
Heinrich Schuchardt
xypron.glpk at gmx.de
Sun Jul 14 21:31:50 UTC 2019
Packed structures like struct uuid are not aligned. GCC 9.1 therefore
throws an error when trying to compile gen_rand_uuid().
lib/uuid.c: In function ‘gen_rand_uuid’:
lib/uuid.c:244:2: error: converting a packed ‘struct uuid’ pointer
(alignment 1) to a ‘unsigned int’ pointer (alignment 4) may result in
an unaligned pointer value [-Werror=address-of-packed-member]
244 | unsigned int *ptr = (unsigned int *)&uuid;
| ^~~~~~~~
Generate the uuid in a properly aligned buffer.
The byte order of a random number should not matter. Do not call
cpu_to_be32() to change the byte order.
Reported-by: Ramon Fried <rfried.dev at gmail.com>
Signed-off-by: Heinrich Schuchardt <xypron.glpk at gmx.de>
---
lib/uuid.c | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/lib/uuid.c b/lib/uuid.c
index 7d7a2749b6..c18014171c 100644
--- a/lib/uuid.c
+++ b/lib/uuid.c
@@ -240,25 +240,25 @@ void uuid_bin_to_str(unsigned char *uuid_bin, char *uuid_str, int str_format)
#if defined(CONFIG_RANDOM_UUID) || defined(CONFIG_CMD_UUID)
void gen_rand_uuid(unsigned char *uuid_bin)
{
- struct uuid uuid;
- unsigned int *ptr = (unsigned int *)&uuid;
+ u32 ptr[4];
+ struct uuid *uuid = (struct uuid *)ptr;
int i;
srand(get_ticks() + rand());
/* Set all fields randomly */
- for (i = 0; i < sizeof(struct uuid) / sizeof(*ptr); i++)
- *(ptr + i) = cpu_to_be32(rand());
+ for (i = 0; i < 4; i++)
+ ptr[i] = rand();
- clrsetbits_be16(&uuid.time_hi_and_version,
+ clrsetbits_be16(&uuid->time_hi_and_version,
UUID_VERSION_MASK,
UUID_VERSION << UUID_VERSION_SHIFT);
- clrsetbits_8(&uuid.clock_seq_hi_and_reserved,
+ clrsetbits_8(&uuid->clock_seq_hi_and_reserved,
UUID_VARIANT_MASK,
UUID_VARIANT << UUID_VARIANT_SHIFT);
- memcpy(uuid_bin, &uuid, sizeof(struct uuid));
+ memcpy(uuid_bin, uuid, 16);
}
/*
--
2.22.0
More information about the U-Boot
mailing list