summaryrefslogtreecommitdiff
path: root/indra/llcommon/llstreamtools.cpp
diff options
context:
space:
mode:
authorJosh Bell <josh@lindenlab.com>2008-02-07 17:15:18 +0000
committerJosh Bell <josh@lindenlab.com>2008-02-07 17:15:18 +0000
commit8bd6a0b3217ea5614d2a29195e528aa8314f6342 (patch)
treebe5cee5be0678bb03c7174bab9296cfc530d0102 /indra/llcommon/llstreamtools.cpp
parent3314f78a3673c1250e47722848c60d017dafac97 (diff)
svn merge -r 79445:79449 svn+ssh://svn.lindenlab.com/svn/linden/qa/maintenance-5-merge-79386
QAR-242 merge of maintenance-5 (QAR-203) * DEV-6548 Copy To Inventory fail to execute without any output feedback when Notecard has changes but not saved * DEV-7600 Deleting someone else's object in god mode crashes sim * DEV-5329 LLSD parsers should determine and set maximum parse sizes * DEV-7473 Resolve instant message crash report * DEV-2904 Presence Issues not (apparently) caused by scripted attachments * DEV-7083 Investigate Null Folder IDs Bug that caused 470K inventory items with Null Folder IDS on the Grid * DEV-2865 Textures/Snapshots in a notecard are opened again when you click copy to inventory. * DEV-6612 VWR-3290: Linux scons build script doesn't work with distcc * DEV-8002 c++ llsd notation parser accepts malformed data * DEV-8001 c++ xml parse returns wrong number of elements parsed * DEV-8089 Double delete in statc structured data parse functions * DEV-5326 Any viewer can request presence information for any agent * DEV-2378 python service builder does not sort query string * DEV-7872 Block teleport off teen grid sub-estates like Schome Park / Open University * DEV-4465 Add a "logfile" command line option to the sim to create log files
Diffstat (limited to 'indra/llcommon/llstreamtools.cpp')
-rw-r--r--indra/llcommon/llstreamtools.cpp27
1 files changed, 18 insertions, 9 deletions
diff --git a/indra/llcommon/llstreamtools.cpp b/indra/llcommon/llstreamtools.cpp
index bfe1765827..8d4a3ef6b8 100644
--- a/indra/llcommon/llstreamtools.cpp
+++ b/indra/llcommon/llstreamtools.cpp
@@ -538,23 +538,32 @@ void get_keyword_and_value(std::string& keyword,
}
}
-std::istream& fullread(std::istream& str, char *buf, std::streamsize requested)
+std::streamsize fullread(
+ std::istream& istr,
+ char* buf,
+ std::streamsize requested)
{
std::streamsize got;
std::streamsize total = 0;
- str.read(buf, requested); /*Flawfinder: ignore*/
- got = str.gcount();
+ istr.read(buf, requested); /*Flawfinder: ignore*/
+ got = istr.gcount();
total += got;
- while (got && total < requested)
+ while(got && total < requested)
{
- if (str.fail())
- str.clear();
- str.read(buf + total, requested - total); /*Flawfinder: ignore*/
- got = str.gcount();
+ if(istr.fail())
+ {
+ // If bad is true, not much we can doo -- it implies loss
+ // of stream integrity. Bail in that case, and otherwise
+ // clear and attempt to continue.
+ if(istr.bad()) return total;
+ istr.clear();
+ }
+ istr.read(buf + total, requested - total); /*Flawfinder: ignore*/
+ got = istr.gcount();
total += got;
}
- return str;
+ return total;
}
std::istream& operator>>(std::istream& str, const char *tocheck)