Workaround Clang bug on POWER. Change-Id: I07275700c0d46976fb0d5070554d19d62fb01b1e Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/36944 Commit-Queue: Adam Langley <agl@google.com> Reviewed-by: David Benjamin <davidben@google.com>
diff --git a/crypto/fipsmodule/bn/bn.c b/crypto/fipsmodule/bn/bn.c index 51b828a..c57c4e0 100644 --- a/crypto/fipsmodule/bn/bn.c +++ b/crypto/fipsmodule/bn/bn.c
@@ -384,6 +384,21 @@ } int bn_resize_words(BIGNUM *bn, size_t words) { +#if defined(OPENSSL_PPC64LE) + // This is a workaround for a miscompilation bug in Clang 7.0.1 on POWER. + // The unittests catch the miscompilation, if it occurs, and it manifests + // as a crash in |bn_fits_in_words|. + // + // The bug only triggers if building in FIPS mode and with -O3. Clang 8.0.1 + // has the same bug but this workaround is not effective there---I've not + // been able to find a workaround for 8.0.1. + // + // TODO(agl): include a bug link if possible. + if (value_barrier_w((size_t)bn->width == words)) { + return 1; + } +#endif + if ((size_t)bn->width <= words) { if (!bn_wexpand(bn, words)) { return 0;