summaryrefslogtreecommitdiffstats
path: root/libcxx/src
diff options
context:
space:
mode:
authorEric Fiselier <eric@efcs.ca>2019-03-05 02:10:31 +0000
committerEric Fiselier <eric@efcs.ca>2019-03-05 02:10:31 +0000
commit1c014d75b4cdcfab5cef304e5f9c5def96468751 (patch)
tree5be06a180e101fba1baa66173ee9bd60b254db47 /libcxx/src
parente69290dc7ff7319acf5904f15ab6630fad07ab58 (diff)
downloadbcm5719-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.cpp15
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
OpenPOWER on IntegriCloud