diff options
| author | Eric Fiselier <eric@efcs.ca> | 2019-03-05 02:10:31 +0000 |
|---|---|---|
| committer | Eric Fiselier <eric@efcs.ca> | 2019-03-05 02:10:31 +0000 |
| commit | 1c014d75b4cdcfab5cef304e5f9c5def96468751 (patch) | |
| tree | 5be06a180e101fba1baa66173ee9bd60b254db47 /libcxx/src | |
| parent | e69290dc7ff7319acf5904f15ab6630fad07ab58 (diff) | |
| download | bcm5719-llvm-1c014d75b4cdcfab5cef304e5f9c5def96468751.tar.gz bcm5719-llvm-1c014d75b4cdcfab5cef304e5f9c5def96468751.zip | |
Fix -fsanitize=vptr badness in <__debug>
Summary:
This patch fixes a lifetime bug when inserting a new container into the debug database. It is
diagnosed by UBSAN when debug mode is enabled. This patch corrects how nodes are constructed
during insertion.
The fix requires unconditionally breaking the debug mode ABI. Users should not expect ABI
stability from debug mode.
Reviewers: ldionne, serge-sans-paille, EricWF
Reviewed By: EricWF
Subscribers: mclow.lists, christof, libcxx-commits
Tags: #libc
Differential Revision: https://reviews.llvm.org/D58011
llvm-svn: 355367
Diffstat (limited to 'libcxx/src')
| -rw-r--r-- | libcxx/src/debug.cpp | 15 |
1 files changed, 6 insertions, 9 deletions
diff --git a/libcxx/src/debug.cpp b/libcxx/src/debug.cpp index 2e88b859be3..28a1f70a59b 100644 --- a/libcxx/src/debug.cpp +++ b/libcxx/src/debug.cpp @@ -203,8 +203,8 @@ __libcpp_db::__insert_ic(void* __i, const void* __c) i->__c_ = c; } -__c_node* -__libcpp_db::__insert_c(void* __c) +void +__libcpp_db::__insert_c(void* __c, __libcpp_db::_InsertConstruct *__fn) { #ifndef _LIBCPP_HAS_NO_THREADS WLock _(mut()); @@ -234,15 +234,12 @@ __libcpp_db::__insert_c(void* __c) } size_t hc = hash<void*>()(__c) % static_cast<size_t>(__cend_ - __cbeg_); __c_node* p = __cbeg_[hc]; - __c_node* r = __cbeg_[hc] = - static_cast<__c_node*>(malloc(sizeof(__c_node))); - if (__cbeg_[hc] == nullptr) - __throw_bad_alloc(); + void *buf = malloc(sizeof(__c_node)); + if (buf == nullptr) + __throw_bad_alloc(); + __cbeg_[hc] = __fn(buf, __c, p); - r->__c_ = __c; - r->__next_ = p; ++__csz_; - return r; } void |

