Opened 12 years ago
Last modified 11 years ago
#4635 new Bugs
segmentation fault in text_oarchive::save_binary()
| Reported by: | Owned by: | Robert Ramey | |
|---|---|---|---|
| Milestone: | To Be Determined | Component: | serialization |
| Version: | Boost 1.43.0 | Severity: | Problem |
| Keywords: | Cc: |
Description
It appears that text_oarchive::save_binary() reads one byte too many. In other words, save_binary(addr,len) appears to read byte addr+len. The attached program, which runs on Linux, allocates a page of zeroes with mmap(2) and then serializes the last few bytes of the page with text_oarchive::save_binary(). The result is a segmentation fault.
Attachments (1)
Change History (4)
by , 12 years ago
| Attachment: | save_binary_bug.cpp added |
|---|
comment:1 by , 12 years ago
a very good example/test. As you mention - a very, very deep stack.
Could you re-run the test with some counts which are mod 3? That is 3, 6, 9, ...
I develop on a windows system and it would be easier to ask you to just re-run the test rather than try to recreate it here.
Robert Ramey
comment:2 by , 12 years ago
Robert,
You are on to something. Multiples of three work fine. If there is anything else that I can do to help, don't hesitate to ask.
-Mark
comment:3 by , 11 years ago
I met the same issue, i debugged and found that problem is in implementation base64_from_binary. Access violation appears in file transform_width.hpp. When iterator points to the last valid byte (addr+len-1) and algorithm need one more byte to complete missing bits - it increments iterator and read after buffer.
template<class Base, int BitsOut, int BitsIn, class CharType>
CharType transform_width<Base, BitsOut, BitsIn, CharType>::fill(){
CharType retval = 0;
unsigned int missing_bits = BitsOut;
for(;;){
unsigned int bcount;
if(! m_bufferfull){
m_buffer = * this->base_reference(); !!! access to byte *(addr+len)
m_bufferfull = true;
bcount = BitsIn;
}
else
bcount = BitsIn - m_displacement;
unsigned int i = (std::min)(bcount, missing_bits);
// shift interesting bits to least significant position
unsigned int j = m_buffer >> (bcount - i);
// strip off uninteresting bits
// (note presumption of two's complement arithmetic)
j &= ~(-(1 << i));
// append then interesting bits to the output value
retval <<= i;
retval |= j;
missing_bits -= i;
if(0 == missing_bits)
break;
// note: suspect that this is not invoked for borland 5.51
++(this->base_reference());
m_bufferfull = false;
}
return retval;
}

Linux/C++ program.