[CodeView] Healthy paranoia around strings

Make sure strings don't get too big for a record, truncate them if
need-be.

llvm-svn: 273710
This commit is contained in:
David Majnemer 2016-06-24 19:34:41 +00:00
parent b8503d5399
commit f15064871a
4 changed files with 6 additions and 10 deletions

View File

@ -50,7 +50,7 @@ private:
return ContinuationOffsets.empty() ? 0 : ContinuationOffsets.back(); return ContinuationOffsets.empty() ? 0 : ContinuationOffsets.back();
} }
size_t getLastContinuationEnd() const { return Builder.size(); } size_t getLastContinuationEnd() const { return Builder.size(); }
unsigned getLastContinuationSize() const { size_t getLastContinuationSize() const {
return getLastContinuationEnd() - getLastContinuationStart(); return getLastContinuationEnd() - getLastContinuationStart();
} }

View File

@ -40,7 +40,6 @@ public:
void writeEncodedInteger(int64_t Value); void writeEncodedInteger(int64_t Value);
void writeEncodedSignedInteger(int64_t Value); void writeEncodedSignedInteger(int64_t Value);
void writeEncodedUnsignedInteger(uint64_t Value); void writeEncodedUnsignedInteger(uint64_t Value);
void writeNullTerminatedString(const char *Value);
void writeNullTerminatedString(StringRef Value); void writeNullTerminatedString(StringRef Value);
void writeGuid(StringRef Guid); void writeGuid(StringRef Guid);
void writeBytes(StringRef Value) { Stream << Value; } void writeBytes(StringRef Value) { Stream << Value; }

View File

@ -49,8 +49,10 @@ void ListRecordBuilder::finishSubRecord() {
// back up and insert a continuation record, sliding the current subrecord // back up and insert a continuation record, sliding the current subrecord
// down. // down.
if (getLastContinuationSize() > 65535 - 8) { if (getLastContinuationSize() > 65535 - 8) {
assert(SubrecordStart != 0 && "can't slide from the start!");
SmallString<128> SubrecordCopy( SmallString<128> SubrecordCopy(
Builder.str().slice(SubrecordStart, Builder.size())); Builder.str().slice(SubrecordStart, Builder.size()));
assert(SubrecordCopy.size() < 65530 && "subrecord is too large to slide!");
Builder.truncate(SubrecordStart); Builder.truncate(SubrecordStart);
// Write a placeholder continuation record. // Write a placeholder continuation record.

View File

@ -91,15 +91,10 @@ void TypeRecordBuilder::writeEncodedUnsignedInteger(uint64_t Value) {
} }
} }
void TypeRecordBuilder::writeNullTerminatedString(const char *Value) {
assert(Value != nullptr);
size_t Length = strlen(Value);
Stream.write(Value, Length);
writeUInt8(0);
}
void TypeRecordBuilder::writeNullTerminatedString(StringRef Value) { void TypeRecordBuilder::writeNullTerminatedString(StringRef Value) {
// Microsoft's linker seems to have trouble with symbol names longer than
// 0xffd8 bytes.
Value = Value.substr(0, 0xffd8);
Stream.write(Value.data(), Value.size()); Stream.write(Value.data(), Value.size());
writeUInt8(0); writeUInt8(0);
} }