Index: src/google/protobuf/message.cc =================================================================== --- src/google/protobuf/message.cc (revision 490) +++ src/google/protobuf/message.cc (working copy) @@ -277,7 +277,8 @@ void GeneratedMessageFactory::RegisterFile( const char* file, RegistrationFunc* registration_func) { if (!InsertIfNotPresent(&file_map_, file, registration_func)) { - GOOGLE_LOG(FATAL) << "File is already registered: " << file; + registration_func(file); + //GOOGLE_LOG(FATAL) << "File is already registered: " << file; } } @@ -292,7 +293,7 @@ // the mutex. mutex_.AssertHeld(); if (!InsertIfNotPresent(&type_map_, descriptor, prototype)) { - GOOGLE_LOG(DFATAL) << "Type is already registered: " << descriptor->full_name(); + //GOOGLE_LOG(DFATAL) << "Type is already registered: " << descriptor->full_name(); } } Index: src/google/protobuf/descriptor_database.cc =================================================================== --- src/google/protobuf/descriptor_database.cc (revision 490) +++ src/google/protobuf/descriptor_database.cc (working copy) @@ -309,7 +309,18 @@ const void* encoded_file_descriptor, int size) { FileDescriptorProto file; if (file.ParseFromArray(encoded_file_descriptor, size)) { + std::pair existing = index_.FindFile(file.name()); + if (existing.first) { + if (existing.second == size && memcmp(existing.first, encoded_file_descriptor, size) == 0) { + // Contents match + return true; + } + else { + GOOGLE_LOG(ERROR) << "File descriptor " << file.name() << " is already registered, but descriptor contents are different"; + } + } return index_.AddFile(file, make_pair(encoded_file_descriptor, size)); + } else { GOOGLE_LOG(ERROR) << "Invalid file descriptor data passed to " "EncodedDescriptorDatabase::Add().";