mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-23 01:00:53 +08:00
streambuf.tcc (__copy_streambufs): verify __sbin->gptr() + __bufsize < __sbin->egptr() before using.
2002-11-18 Jonathan Lennox <lennox@cs.columbia.edu> * include/bits/streambuf.tcc (__copy_streambufs): verify __sbin->gptr() + __bufsize < __sbin->egptr() before using. * testsuite/27_io/ostream_inserter_other.cc (test_buffer_4): Add. (test05): Use test_buffer_4. Delete unused ostringstream variables. From-SVN: r59234
This commit is contained in:
parent
8c9aa0cba9
commit
5bdb1440a1
@ -1,3 +1,11 @@
|
||||
2002-11-18 Jonathan Lennox <lennox@cs.columbia.edu>
|
||||
|
||||
* include/bits/streambuf.tcc (__copy_streambufs): verify
|
||||
__sbin->gptr() + __bufsize < __sbin->egptr() before using.
|
||||
* testsuite/27_io/ostream_inserter_other.cc (test_buffer_4): Add.
|
||||
(test05): Use test_buffer_4. Delete unused ostringstream
|
||||
variables.
|
||||
|
||||
2002-11-18 Paolo Carlini <pcarlini@unitus.it>
|
||||
|
||||
PR libstdc++/6745 (continued)
|
||||
|
@ -213,7 +213,8 @@ namespace std
|
||||
{
|
||||
while (__testput && __bufsize != -1)
|
||||
{
|
||||
if (__bufsize != 0 && __sbin->gptr() != NULL)
|
||||
if (__bufsize != 0 && __sbin->gptr() != NULL
|
||||
&& __sbin->gptr() + __bufsize <= __sbin->egptr())
|
||||
{
|
||||
__xtrct = __sbout->sputn(__sbin->gptr(), __bufsize);
|
||||
__ret += __xtrct;
|
||||
|
@ -198,6 +198,28 @@ private:
|
||||
std::string::const_iterator it;
|
||||
};
|
||||
|
||||
class test_buffer_4 : public std::streambuf {
|
||||
public:
|
||||
test_buffer_4(const std::string& s) : str(s), it(str.begin())
|
||||
{
|
||||
if (it != str.end()) {
|
||||
buf[0] = *it++;
|
||||
setg(buf, buf, buf+1);
|
||||
}
|
||||
}
|
||||
|
||||
protected:
|
||||
virtual int underflow() { return (it != str.end() ? *it : EOF); }
|
||||
virtual int uflow() { return (it != str.end() ? *it++ : EOF); }
|
||||
virtual std::streamsize showmanyc() {
|
||||
std::streamsize ret = std::distance(it, str.end());
|
||||
return ret > 0 ? ret : -1;
|
||||
}
|
||||
private:
|
||||
const std::string str;
|
||||
std::string::const_iterator it;
|
||||
char buf[1];
|
||||
};
|
||||
|
||||
void test(const std::string& str, std::streambuf& buf)
|
||||
{
|
||||
@ -218,8 +240,6 @@ void test(const std::string& str, std::streambuf& buf)
|
||||
// Jonathan Lennox <lennox@cs.columbia.edu>
|
||||
void test05()
|
||||
{
|
||||
std::ostringstream out_1, out_2, out_3, out_4;
|
||||
|
||||
std::string string_a("Hello, world!");
|
||||
std::string string_b("");
|
||||
|
||||
@ -232,6 +252,9 @@ void test05()
|
||||
test_buffer_3 buf3a(string_a);
|
||||
test_buffer_3 buf3b(string_b);
|
||||
|
||||
test_buffer_4 buf4a(string_a);
|
||||
test_buffer_4 buf4b(string_b);
|
||||
|
||||
test(string_a, buf1a);
|
||||
test(string_b, buf1b);
|
||||
|
||||
@ -240,6 +263,9 @@ void test05()
|
||||
|
||||
test(string_a, buf3a);
|
||||
test(string_b, buf3b);
|
||||
|
||||
test(string_a, buf4a);
|
||||
test(string_b, buf4b);
|
||||
}
|
||||
|
||||
int
|
||||
|
Loading…
x
Reference in New Issue
Block a user