Fix undefined memory management found by Clang's sanitizers.

See https://github.com/google/protobuf/issues/3752 for context.
This commit is contained in:
John Millikin 2017-10-16 12:05:21 -07:00
parent f850188e6e
commit aff10976fc
No known key found for this signature in database
GPG Key ID: 1F7686B8DA217791
4 changed files with 16 additions and 10 deletions

View File

@ -4309,8 +4309,10 @@ FileDescriptor* DescriptorBuilder::BuildFileImpl(
result->dependencies_once_ = tables_->AllocateOnceDynamic();
result->dependencies_names_ =
tables_->AllocateArray<const string*>(proto.dependency_size());
memset(result->dependencies_names_, 0,
sizeof(*result->dependencies_names_) * proto.dependency_size());
if (proto.dependency_size() > 0) {
memset(result->dependencies_names_, 0,
sizeof(*result->dependencies_names_) * proto.dependency_size());
}
} else {
result->dependencies_once_ = NULL;
result->dependencies_names_ = NULL;

View File

@ -1244,10 +1244,12 @@ class TextFormat::Printer::TextGenerator
while (size > buffer_size_) {
// Data exceeds space in the buffer. Copy what we can and request a
// new buffer.
memcpy(buffer_, data, buffer_size_);
data += buffer_size_;
size -= buffer_size_;
void* void_buffer;
if (buffer_size_ > 0) {
memcpy(buffer_, data, buffer_size_);
data += buffer_size_;
size -= buffer_size_;
}
void* void_buffer = NULL;
failed_ = !output_->Next(&void_buffer, &buffer_size_);
if (failed_) return;
buffer_ = reinterpret_cast<char*>(void_buffer);

View File

@ -61,9 +61,11 @@ void ZeroCopyStreamByteSink::Append(const char* bytes, size_t len) {
buffer_size_ -= len;
return;
}
memcpy(buffer_, bytes, buffer_size_);
bytes += buffer_size_;
len -= buffer_size_;
if (buffer_size_ > 0) {
memcpy(buffer_, bytes, buffer_size_);
bytes += buffer_size_;
len -= buffer_size_;
}
if (!stream_->Next(&buffer_, &buffer_size_)) {
// There isn't a way for ByteSink to report errors.
buffer_size_ = 0;

View File

@ -179,7 +179,7 @@ namespace internal {
class LIBPROTOBUF_EXPORT ZeroCopyStreamByteSink : public strings::ByteSink {
public:
explicit ZeroCopyStreamByteSink(io::ZeroCopyOutputStream* stream)
: stream_(stream), buffer_size_(0) {}
: stream_(stream), buffer_(NULL), buffer_size_(0) {}
~ZeroCopyStreamByteSink();
virtual void Append(const char* bytes, size_t len);