Skip to content

Commit

Permalink
[build] Fix build failures with older versions of gcc
Browse files Browse the repository at this point in the history
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 <[email protected]>
  • Loading branch information
mcb30 committed Feb 10, 2024
1 parent 0f5abd8 commit 94b39fb
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 7 deletions.
14 changes: 8 additions & 6 deletions src/crypto/gcm.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 ) );
Expand Down
3 changes: 2 additions & 1 deletion src/include/ipxe/gcm.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 ); \
Expand Down

0 comments on commit 94b39fb

Please sign in to comment.