From: Paolo Carlini Date: Fri, 30 Jan 2004 13:23:42 +0000 (+0000) Subject: basic_string.tcc (_Rep::_S_create): Never allocate a string bigger than max_size... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=d1615643e511bab93bdf275303aab9468505bc79;p=gcc.git basic_string.tcc (_Rep::_S_create): Never allocate a string bigger than max_size()... 2004-01-30 Paolo Carlini * include/bits/basic_string.tcc (_Rep::_S_create): Never allocate a string bigger than max_size(); always keep __capacity and __size in sync to avoid memory leaks at deallocation time. From-SVN: r76955 --- diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index e13c44a07c7..0273958d79e 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,10 @@ +2004-01-30 Paolo Carlini + + * include/bits/basic_string.tcc (_Rep::_S_create): + Never allocate a string bigger than max_size(); always keep + __capacity and __size in sync to avoid memory leaks at + deallocation time. + 2004-01-30 Paolo Carlini * include/bits/basic_string.tcc (_S_construct(_InIterator, diff --git a/libstdc++-v3/include/bits/basic_string.tcc b/libstdc++-v3/include/bits/basic_string.tcc index a478a4cf248..e35b305cdeb 100644 --- a/libstdc++-v3/include/bits/basic_string.tcc +++ b/libstdc++-v3/include/bits/basic_string.tcc @@ -520,7 +520,10 @@ namespace std - (__size + __malloc_header_size) % __pagesize); __capacity += __extra / sizeof(_CharT); - __size += __extra; + // Never allocate a string bigger than _S_max_size. + if (__capacity > _S_max_size) + __capacity = _S_max_size; + __size = (__capacity + 1) * sizeof(_CharT) + sizeof(_Rep); } else if (__size > __subpagesize) { @@ -528,7 +531,7 @@ namespace std - (__size + __malloc_header_size) % __subpagesize); __capacity += __extra / sizeof(_CharT); - __size += __extra; + __size = (__capacity + 1) * sizeof(_CharT) + sizeof(_Rep); } // NB: Might throw, but no worries about a leak, mate: _Rep()