aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Kosnik <bkoz@redhat.com>2002-05-15 13:15:17 +0000
committerBenjamin Kosnik <bkoz@gcc.gnu.org>2002-05-15 13:15:17 +0000
commitfb5b4dfdcba3e04c784a87f1b6fa5a7d088748b9 (patch)
treed56638b81fddc1100b68993d28c9cb43e8645e99
parentbf6f276b01d364d1fe300732d39a56f4a6f4ee34 (diff)
downloadgcc-fb5b4dfdcba3e04c784a87f1b6fa5a7d088748b9.zip
gcc-fb5b4dfdcba3e04c784a87f1b6fa5a7d088748b9.tar.gz
gcc-fb5b4dfdcba3e04c784a87f1b6fa5a7d088748b9.tar.bz2
re PR libstdc++/6594 (strstreambuf leaks 16 bytes - gcc 3.0.x)
2002-05-15 Benjamin Kosnik <bkoz@redhat.com> PR libstdc++/6594 * src/strstream.cc (strstreambuf): Fix leak. From-SVN: r53486
-rw-r--r--libstdc++-v3/ChangeLog5
-rw-r--r--libstdc++-v3/src/strstream.cc35
2 files changed, 26 insertions, 14 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index d6fc098..4018151 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,8 @@
+2002-05-15 Benjamin Kosnik <bkoz@redhat.com>
+
+ PR libstdc++/6594
+ * src/strstream.cc (strstreambuf): Fix leak.
+
2002-05-15 Paolo Carlini <pcarlini@unitus.it>
PR libstdc++/6648
diff --git a/libstdc++-v3/src/strstream.cc b/libstdc++-v3/src/strstream.cc
index 2160c44..7bd8d9c 100644
--- a/libstdc++-v3/src/strstream.cc
+++ b/libstdc++-v3/src/strstream.cc
@@ -64,13 +64,13 @@ strstreambuf::strstreambuf(streamsize initial_capacity)
_M_alloc_fun(0), _M_free_fun(0),
_M_dynamic(true), _M_frozen(false), _M_constant(false)
{
- streamsize n = max(initial_capacity, streamsize(16));
-
- char* buf = _M_alloc(n);
- if (buf) {
- setp(buf, buf + n);
- setg(buf, buf, buf);
- }
+ _M_buf_size = _M_buf_size_opt = max(initial_capacity, streamsize(16));
+ _M_buf = _M_alloc(_M_buf_size);
+ if (_M_buf)
+ {
+ setp(_M_buf, _M_buf + _M_buf_size);
+ setg(_M_buf, _M_buf, _M_buf);
+ }
}
strstreambuf::strstreambuf(void* (*alloc_f)(size_t), void (*free_f)(void*))
@@ -78,12 +78,12 @@ strstreambuf::strstreambuf(void* (*alloc_f)(size_t), void (*free_f)(void*))
_M_alloc_fun(alloc_f), _M_free_fun(free_f),
_M_dynamic(true), _M_frozen(false), _M_constant(false)
{
- streamsize n = 16;
-
- char* buf = _M_alloc(n);
- if (buf) {
- setp(buf, buf + n);
- setg(buf, buf, buf);
+ _M_buf_size = _M_buf_size_opt = 16;
+ _M_buf = _M_alloc(_M_buf_size);
+ if (_M_buf)
+ {
+ setp(_M_buf, _M_buf + _M_buf_size);
+ setg(_M_buf, _M_buf, _M_buf);
}
}
@@ -139,7 +139,14 @@ strstreambuf::strstreambuf(const unsigned char* get, streamsize n)
strstreambuf::~strstreambuf()
{
if (_M_dynamic && !_M_frozen)
- _M_free(eback());
+ {
+ char* p = this->eback();
+ _M_free(p);
+ if (p == _M_buf)
+ _M_buf = 0;
+ }
+ if (_M_buf)
+ _M_free(_M_buf);
}
void strstreambuf::freeze(bool frozenflag)