I got the same crash,how to avoid this kind of problem?I think this may be 
due to our special writing, but what are the specific possibilities?

在 2015年1月24日星期六 UTC+8上午7:19:05,Jana Baran写道:
>
> Potential overflow problem occurs all around the protobuf code.
> For example see message_lite.cc
>
> "
> bool MessageLite::AppendPartialToString(string* output) const {
>   int old_size = output->size();
>   int byte_size = ByteSize();
>   STLStringResizeUninitialized(output, old_size + byte_size);
>   uint8* start = reinterpret_cast<uint8*>(string_as_array(output) + 
> old_size);
>   uint8* end = SerializeWithCachedSizesToArray(start);
>   if (end - start != byte_size) {
>     ByteSizeConsistencyError(byte_size, ByteSize(), end - start);
>   }
>   return true;
> }
> "
>
> First two lines, size_t (unsigned 64b on a 64b architecture) is cast to 
> int (signed 32b). 
>
> Third line problem is 'old_size + byte_size' which can overflow. There 
> should be a check before the summation like:
>
> size_t new_size = 0;
> if (std::numeric_limits<size_t>::max() - old_size < byte_size) {
>  // we have a problem
> } else {
>  new_size = old_size + byte_size;
> }
>
> STLStringResizeUninitialized correctly takes size_t as an input but you 
> need to cast before the summation and not after, like "(size_t)old_size + 
> byte_size" 
>
> Next two lines: 'start' and 'end' is of type uint8 which is unsigned 8bit 
> integer. On next line this uint8 is compared with byte_size (1B variable 
> compared with 4B variable) and ByteSizeConsistencyError is called when we 
> are not happy with the comparison.
>
> Now funny part is the comment above MessageLite::ByteSizeConsistencyError 
> method which states:
>
> "...If serialization produces a different number of bytes than expected, 
> we call this function, which crashes. The problem could be due to a bug in 
> the protobuf implementation..." 
>

-- 
You received this message because you are subscribed to the Google Groups 
"Protocol Buffers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/protobuf.
For more options, visit https://groups.google.com/d/optout.

Reply via email to