diff options
author | Heinrich Schuchardt <xypron.glpk@gmx.de> | 2019-07-14 23:31:50 +0200 |
---|---|---|
committer | Tom Rini <trini@konsulko.com> | 2019-07-29 09:32:13 -0400 |
commit | a1b633df55d5207b49ce145ede783d671385854c (patch) | |
tree | ed8a3a52adb75ba8416bd1c9a6fe808ea5391b7d /lib/uuid.c | |
parent | 0c4e81e0eb6bec3aab1f4500f8fb347202c5b601 (diff) | |
download | u-boot-a1b633df55d5207b49ce145ede783d671385854c.tar.gz u-boot-a1b633df55d5207b49ce145ede783d671385854c.tar.bz2 u-boot-a1b633df55d5207b49ce145ede783d671385854c.zip |
lib: uuid: alignment error in gen_rand_uuid()
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@gmail.com>
Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
Diffstat (limited to 'lib/uuid.c')
-rw-r--r-- | lib/uuid.c | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/lib/uuid.c b/lib/uuid.c index 7d7a2749b6..ca8be2cdca 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); } /* |