Work around more C language bugs with empty spans.
C's specification text around pointer arithmetic is buggy and fails to
account for empty spans. Empty spans are typically represented as
ptr=NULL and len=0, so (T*)NULL + 0 must be defined for ptr + len to
reliably work. C++ does not have this bug and specifies this correctly.
See https://crbug.com/1019588.
This language bug has made its way over to newer versions of UBSan,
which enforce this. In the short term, add bogus length checks as a
workaround. However, unlike the memcpy language bug, we cannot address
this systematically. In the long term, we need to switch libcrypto to
building as C++ for a real fix.
To test this, update our clang revision to that in
https://chromium-review.googlesource.com/c/chromium/src/+/1879890. Note
that clang revision was later reverted in Chromium for seemingly
unrelated reasons.
This newer UBSan also catches a memcpy/OPENSSL_memcpy issue in
siphash.c, from the earlier C NULL bug we'd been working around.
Bug: chromium:1019588, chromium:1019644
Change-Id: I460e547c8cd740db68da8cc2a3a970276ec92e90
Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/38584
Reviewed-by: Adam Langley <agl@google.com>
Commit-Queue: Adam Langley <agl@google.com>
diff --git a/crypto/buf/buf.c b/crypto/buf/buf.c
index 717aaac..bd97dd3 100644
--- a/crypto/buf/buf.c
+++ b/crypto/buf/buf.c
@@ -132,6 +132,10 @@
}
int BUF_MEM_append(BUF_MEM *buf, const void *in, size_t len) {
+ // Work around a C language bug. See https://crbug.com/1019588.
+ if (len == 0) {
+ return 1;
+ }
size_t new_len = buf->length + len;
if (new_len < len) {
OPENSSL_PUT_ERROR(BUF, ERR_R_OVERFLOW);
diff --git a/crypto/fipsmodule/modes/gcm.c b/crypto/fipsmodule/modes/gcm.c
index ca077ac..3860ebe 100644
--- a/crypto/fipsmodule/modes/gcm.c
+++ b/crypto/fipsmodule/modes/gcm.c
@@ -699,7 +699,8 @@
}
#if defined(AESNI_GCM)
- if (ctx->gcm_key.use_aesni_gcm_crypt) {
+ // Check |len| to work around a C language bug. See https://crbug.com/1019588.
+ if (ctx->gcm_key.use_aesni_gcm_crypt && len > 0) {
// |aesni_gcm_encrypt| may not process all the input given to it. It may
// not process *any* of its input if it is deemed too small.
size_t bulk = aesni_gcm_encrypt(in, out, len, key, ctx->Yi.c, ctx->Xi.u);
@@ -786,7 +787,8 @@
}
#if defined(AESNI_GCM)
- if (ctx->gcm_key.use_aesni_gcm_crypt) {
+ // Check |len| to work around a C language bug. See https://crbug.com/1019588.
+ if (ctx->gcm_key.use_aesni_gcm_crypt && len > 0) {
// |aesni_gcm_decrypt| may not process all the input given to it. It may
// not process *any* of its input if it is deemed too small.
size_t bulk = aesni_gcm_decrypt(in, out, len, key, ctx->Yi.c, ctx->Xi.u);
diff --git a/crypto/poly1305/poly1305_vec.c b/crypto/poly1305/poly1305_vec.c
index 480d9e5..e7b3ae5 100644
--- a/crypto/poly1305/poly1305_vec.c
+++ b/crypto/poly1305/poly1305_vec.c
@@ -662,6 +662,11 @@
poly1305_state_internal *st = poly1305_aligned_state(state);
size_t want;
+ // Work around a C language bug. See https://crbug.com/1019588.
+ if (bytes == 0) {
+ return;
+ }
+
// need at least 32 initial bytes to start the accelerated branch
if (!st->started) {
if ((st->leftover == 0) && (bytes > 32)) {
diff --git a/crypto/siphash/siphash.c b/crypto/siphash/siphash.c
index 7e4e9c5..f55c3ca 100644
--- a/crypto/siphash/siphash.c
+++ b/crypto/siphash/siphash.c
@@ -17,6 +17,8 @@
#include <openssl/siphash.h>
+#include "../internal.h"
+
static void siphash_round(uint64_t v[4]) {
v[0] += v[1];
@@ -62,7 +64,7 @@
uint64_t word;
} last_block;
last_block.word = 0;
- memcpy(last_block.bytes, input, input_len);
+ OPENSSL_memcpy(last_block.bytes, input, input_len);
last_block.bytes[7] = orig_input_len & 0xff;
v[3] ^= last_block.word;
diff --git a/util/bot/update_clang.py b/util/bot/update_clang.py
index c36ec66..1ed40dc 100644
--- a/util/bot/update_clang.py
+++ b/util/bot/update_clang.py
@@ -19,8 +19,8 @@
# CLANG_REVISION and CLANG_SUB_REVISION determine the build of clang
# to use. These should be synced with tools/clang/scripts/update.py in
# Chromium.
-CLANG_REVISION = '8455294f2ac13d587b13d728038a9bffa7185f2b'
-CLANG_SVN_REVISION = '371202'
+CLANG_REVISION = '55c223a7ed522293cf9995d07d348368c345d1f2'
+CLANG_SVN_REVISION = 'n330255'
CLANG_SUB_REVISION = 1
PACKAGE_VERSION = '%s-%s-%s' % (CLANG_SVN_REVISION, CLANG_REVISION[:8],