Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1655)

Unified Diff: Source/wtf/Optional.h

Issue 1159623012: Intensify security checks for WTF::Optional. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: store a pointer internally so failure mode is null dereference Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/wtf/Optional.h
diff --git a/Source/wtf/Optional.h b/Source/wtf/Optional.h
index 0b453b53415a240799a8f0957fd869b2c0e5f7a3..264b45ed616936fddd1284997a7c3ff21520e711 100644
--- a/Source/wtf/Optional.h
+++ b/Source/wtf/Optional.h
@@ -32,34 +32,31 @@ template <typename T>
class Optional {
WTF_MAKE_NONCOPYABLE(Optional);
public:
- Optional() : m_engaged(false) { }
+ Optional() : m_ptr(nullptr) { }
~Optional()
{
- if (m_engaged)
- storage()->~T();
+ if (m_ptr)
+ m_ptr->~T();
}
- typedef bool Optional::*UnspecifiedBoolType;
- operator UnspecifiedBoolType() const { return m_engaged ? &Optional::m_engaged : nullptr; }
+ typedef T* Optional::*UnspecifiedBoolType;
+ operator UnspecifiedBoolType() const { return m_ptr ? &Optional::m_ptr : nullptr; }
esprehn 2015/06/02 22:13:08 This doesn't need the branch in it, you can just r
jbroman 2015/06/02 23:40:17 This is the pattern used in OwnPtr::operator Unspe
esprehn 2015/06/02 23:57:08 Right, just return a void* or something. Having a
- T& operator*() { ASSERT(m_engaged); return *storage(); }
- const T& operator*() const { ASSERT(m_engaged); return *storage(); }
- T* operator->() { ASSERT(m_engaged); return storage(); }
- const T* operator->() const { ASSERT(m_engaged); return storage(); }
+ T& operator*() { ASSERT_WITH_SECURITY_IMPLICATION(m_ptr); return *m_ptr; }
+ const T& operator*() const { ASSERT_WITH_SECURITY_IMPLICATION(m_ptr); return *m_ptr; }
+ T* operator->() { ASSERT_WITH_SECURITY_IMPLICATION(m_ptr); return m_ptr; }
+ const T* operator->() const { ASSERT_WITH_SECURITY_IMPLICATION(m_ptr); return m_ptr; }
template <typename... Args>
void emplace(Args&&... args)
{
- ASSERT(!m_engaged);
- new (storage()) T(forward<Args>(args)...);
- m_engaged = true;
+ RELEASE_ASSERT(!m_ptr);
+ m_ptr = reinterpret_cast_ptr<T*>(&m_storage.buffer);
+ new (m_ptr) T(forward<Args>(args)...);
}
private:
- T* storage() { return reinterpret_cast_ptr<T*>(&m_storage.buffer); }
- const T* storage() const { return reinterpret_cast_ptr<const T*>(&m_storage.buffer); }
-
- bool m_engaged;
+ T* m_ptr;
AlignedBuffer<sizeof(T), WTF_ALIGN_OF(T)> m_storage;
};
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698