Fix a theoretical overflow in BIO_printf
Found by code inspection. If vsnprintf wanted to write INT_MAX
characters, allocating a INT_MAX + 1 scratch buffer will overflow. Since
we always have INT_MAX < SIZE_MAX, just casting to size_t earlier avoids
this.
(If the malloc implementation is unwilling to allocate INT_MAX + 1,
e.g. it is forbidden to on 32-bit, that's malloc's responsibility to
detect.)
Change-Id: I3c2a740ebc7ecd58464a9f63858ffcefe67f648f
Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/74247
Auto-Submit: David Benjamin <davidben@google.com>
Commit-Queue: Adam Langley <agl@google.com>
Reviewed-by: Adam Langley <agl@google.com>
diff --git a/crypto/bio/printf.cc b/crypto/bio/printf.cc
index 37f4510..4ad3546 100644
--- a/crypto/bio/printf.cc
+++ b/crypto/bio/printf.cc
@@ -76,10 +76,9 @@
}
if ((size_t)out_len >= sizeof(buf)) {
- const int requested_len = out_len;
- // The output was truncated. Note that vsnprintf's return value
- // does not include a trailing NUL, but the buffer must be sized
- // for it.
+ const size_t requested_len = (size_t)out_len;
+ // The output was truncated. Note that vsnprintf's return value does not
+ // include a trailing NUL, but the buffer must be sized for it.
out = reinterpret_cast<char *>(OPENSSL_malloc(requested_len + 1));
out_malloced = 1;
if (out == NULL) {
@@ -88,7 +87,7 @@
va_start(args, format);
out_len = vsnprintf(out, requested_len + 1, format, args);
va_end(args);
- assert(out_len == requested_len);
+ assert(out_len == (int)requested_len);
} else {
out = buf;
}