aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Brown <mcb30@ipxe.org>2024-02-10 14:41:29 +0000
committerMichael Brown <mcb30@ipxe.org>2024-02-10 14:48:56 +0000
commit94b39fbe9298160b034c93ca06deb39a907e3b3f (patch)
tree2dfc041ae6f3dac2f3444cd6efed768b25b17e17
parent0f5abd8b117ea7da0747fe36b66c050706f6584f (diff)
downloadipxe-centos7.zip
ipxe-centos7.tar.gz
ipxe-centos7.tar.bz2
[build] Fix build failures with older versions of gcccentos7
Some versions of gcc (observed with gcc 4.8.5 in CentOS 7) will report spurious build_assert() failures for some assertions about structure layouts. There is no clear pattern as to what causes these spurious failures, and the build assertion does succeed in that no unresolvable symbol reference is generated in the compiled code. Adjust the assertions to work around these apparent compiler issues. Signed-off-by: Michael Brown <mcb30@ipxe.org>
-rw-r--r--src/crypto/gcm.c14
-rw-r--r--src/include/ipxe/gcm.h3
2 files changed, 10 insertions, 7 deletions
diff --git a/src/crypto/gcm.c b/src/crypto/gcm.c
index c21aad1..a32890d 100644
--- a/src/crypto/gcm.c
+++ b/src/crypto/gcm.c
@@ -469,13 +469,15 @@ int gcm_setkey ( struct gcm_context *context, const void *key, size_t keylen,
* @v ivlen Initialisation vector length
*/
void gcm_setiv ( struct gcm_context *context, const void *iv, size_t ivlen ) {
- union gcm_block *check = ( ( void * ) context );
- /* Sanity checks */
- build_assert ( &context->hash == check );
- build_assert ( &context->len == check + 1 );
- build_assert ( &context->ctr == check + 2 );
- build_assert ( &context->key == check + 3 );
+ /* Sanity check: ensure that memset()s will clear expected state */
+ build_assert ( &context->hash < &context->ctr );
+ build_assert ( &context->len < &context->ctr );
+ build_assert ( &context->ctr < &context->key );
+ build_assert ( ( ( void * ) &context->raw_cipher ) >
+ ( ( void * ) &context->key ) );
+ build_assert ( ( ( void * ) context->raw_ctx ) >
+ ( ( void * ) &context->key ) );
/* Reset non-key state */
memset ( context, 0, offsetof ( typeof ( *context ), key ) );
diff --git a/src/include/ipxe/gcm.h b/src/include/ipxe/gcm.h
index 9653a0a..4864445 100644
--- a/src/include/ipxe/gcm.h
+++ b/src/include/ipxe/gcm.h
@@ -89,7 +89,8 @@ static int _gcm_name ## _setkey ( void *ctx, const void *key, \
size_t keylen ) { \
struct _gcm_name ## _context *context = ctx; \
build_assert ( _blocksize == sizeof ( context->gcm.key ) ); \
- build_assert ( ( ( void * ) &context->gcm ) == ctx ); \
+ build_assert ( ( ( void * ) &context->gcm ) == \
+ ( ( void * ) context ) ); \
build_assert ( ( ( void * ) &context->raw ) == \
( ( void * ) context->gcm.raw_ctx ) ); \
return gcm_setkey ( &context->gcm, key, keylen, &_raw_cipher ); \