From 8e3f7ee1473450b90bf77a73a43ff0da75d563dd Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Fri, 10 Apr 2026 20:29:53 -0400 Subject: [PATCH] xo-stringtable2: DString: fail without ub when alloc fails --- src/stringtable2/DString.cpp | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/src/stringtable2/DString.cpp b/src/stringtable2/DString.cpp index 30bfb39..17a94b7 100644 --- a/src/stringtable2/DString.cpp +++ b/src/stringtable2/DString.cpp @@ -26,14 +26,16 @@ namespace xo { void * mem = mm.alloc(typeseq::id(), sizeof(DString) + cap); - result = new (mem) DString(); + if (mem) { + result = new (mem) DString(); - assert(result); + assert(result); - result->capacity_ = cap; - result->size_ = 0; - if (cap > 0) { - result->chars_[0] = '\0'; + result->capacity_ = cap; + result->size_ = 0; + if (cap > 0) { + result->chars_[0] = '\0'; + } } } @@ -50,10 +52,15 @@ namespace xo { void * mem = mm.alloc(typeseq::id(), sizeof(DString) + cap); - DString * result = new (mem) DString(); - result->capacity_ = cap; - result->size_ = len; - std::memcpy(result->chars_, cstr, cap); + DString * result = nullptr; + + if (mem) { + result = new (mem) DString(); + result->capacity_ = cap; + result->size_ = len; + + std::memcpy(result->chars_, cstr, cap); + } return result; }