blob: 8870d397db295ff0947439fac764b71c8eebc9df [file] [log] [blame]
From 5778284149254d019b3f127dc32475ab7b72a7d6 Mon Sep 17 00:00:00 2001
From: hscham <hscham@chromium.org>
Date: Wed, 24 Nov 2021 15:31:40 +0900
Subject: [PATCH] Crash when dereferencing nullopt for std::optional
TODO(b/192529039): this is a temporary patch to address security
concerns when migrating base:Optional and absl::optional to
std::optional. libcxx upstream is working on decoupling hardening and
debugging asserts and this patch should be replaced by the upstream
patch upon completion.
---
libcxx/include/optional | 32 ++++++++++++++++++++++++++++++++
1 file changed, 32 insertions(+)
diff --git a/libcxx/include/optional b/libcxx/include/optional
index d0b9f6d5171f..1b78925156d8 100644
--- a/libcxx/include/optional
+++ b/libcxx/include/optional
@@ -146,6 +146,8 @@ template<class T>
*/
+#include <stdio.h>
+
#include <__availability>
#include <__config>
#include <__debug>
@@ -874,56 +876,86 @@ public:
}
_LIBCPP_INLINE_VISIBILITY
+ _LIBCPP_AVAILABILITY_THROW_BAD_OPTIONAL_ACCESS
constexpr
add_pointer_t<value_type const>
operator->() const
{
_LIBCPP_ASSERT(this->has_value(), "optional operator-> called on a disengaged value");
+ if (!this->has_value()) {
+ fprintf(stderr, "optional operator-> called on a disengaged value\n");
+ __builtin_trap();
+ }
return _VSTD::addressof(this->__get());
}
_LIBCPP_INLINE_VISIBILITY
+ _LIBCPP_AVAILABILITY_THROW_BAD_OPTIONAL_ACCESS
constexpr
add_pointer_t<value_type>
operator->()
{
_LIBCPP_ASSERT(this->has_value(), "optional operator-> called on a disengaged value");
+ if (!this->has_value()) {
+ fprintf(stderr, "optional operator-> called on a disengaged value\n");
+ __builtin_trap();
+ }
return _VSTD::addressof(this->__get());
}
_LIBCPP_INLINE_VISIBILITY
+ _LIBCPP_AVAILABILITY_THROW_BAD_OPTIONAL_ACCESS
constexpr
const value_type&
operator*() const& noexcept
{
_LIBCPP_ASSERT(this->has_value(), "optional operator* called on a disengaged value");
+ if (!this->has_value()) {
+ fprintf(stderr, "optional operator* called on a disengaged value\n");
+ __builtin_trap();
+ }
return this->__get();
}
_LIBCPP_INLINE_VISIBILITY
+ _LIBCPP_AVAILABILITY_THROW_BAD_OPTIONAL_ACCESS
constexpr
value_type&
operator*() & noexcept
{
_LIBCPP_ASSERT(this->has_value(), "optional operator* called on a disengaged value");
+ if (!this->has_value()) {
+ fprintf(stderr, "optional operator* called on a disengaged value\n");
+ __builtin_trap();
+ }
return this->__get();
}
_LIBCPP_INLINE_VISIBILITY
+ _LIBCPP_AVAILABILITY_THROW_BAD_OPTIONAL_ACCESS
constexpr
value_type&&
operator*() && noexcept
{
_LIBCPP_ASSERT(this->has_value(), "optional operator* called on a disengaged value");
+ if (!this->has_value()) {
+ fprintf(stderr, "optional operator* called on a disengaged value\n");
+ __builtin_trap();
+ }
return _VSTD::move(this->__get());
}
_LIBCPP_INLINE_VISIBILITY
+ _LIBCPP_AVAILABILITY_THROW_BAD_OPTIONAL_ACCESS
constexpr
const value_type&&
operator*() const&& noexcept
{
_LIBCPP_ASSERT(this->has_value(), "optional operator* called on a disengaged value");
+ if (!this->has_value()) {
+ fprintf(stderr, "optional operator* called on a disengaged value\n");
+ __builtin_trap();
+ }
return _VSTD::move(this->__get());
}
--
2.34.1.575.g55b058a8bb-goog