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;