Skip to content

Commit 4997a3f

Browse files
committed
[SourceKit] Fix memory issue in response construction for typecontextinfo
Buffer may be reallocated during the construction. We can't modify buffer `SmallString` after getting 'StringRef' out of it.
1 parent 3cbb827 commit 4997a3f

File tree

1 file changed

+35
-17
lines changed

1 file changed

+35
-17
lines changed

tools/SourceKit/lib/SwiftLang/SwiftTypeContextInfo.cpp

Lines changed: 35 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -105,51 +105,69 @@ void SwiftLangSupport::getExpressionContextInfo(
105105
SwiftLangSupport::printTypeUSR(Item.ExpectedTy, OS);
106106
unsigned TypeUSRLength = SS.size() - TypeUSRBegin;
107107

108-
SmallVector<SourceKit::TypeContextInfoItem::Member, 8> ImplicitMembers;
108+
struct MemberInfo {
109+
size_t DeclNameBegin = 0;
110+
size_t DeclNameLength = 0;
111+
size_t DescriptionBegin = 0;
112+
size_t DescriptionLength = 0;
113+
size_t SourceTextBegin = 0;
114+
size_t SourceTextLength = 0;
115+
StringRef BriefComment;
116+
117+
MemberInfo() {}
118+
};
119+
SmallVector<MemberInfo, 8> ImplicitMembers;
109120
for (auto member : Item.ImplicitMembers) {
121+
ImplicitMembers.emplace_back();
122+
auto &memberElem = ImplicitMembers.back();
110123

111124
// Name.
112-
unsigned DeclNameBegin = SS.size();
125+
memberElem.DeclNameBegin = SS.size();
113126
member->getFullName().print(OS);
114-
unsigned DeclNameLength = SS.size() - DeclNameBegin;
115-
StringRef DeclNameStr(SS.begin() + DeclNameBegin, DeclNameLength);
127+
memberElem.DeclNameLength = SS.size() - memberElem.DeclNameBegin;
116128

117129
// Description.
118-
unsigned DescriptionBegin = SS.size();
130+
memberElem.DescriptionBegin = SS.size();
119131
SwiftLangSupport::printMemberDeclDescription(
120132
member, Item.ExpectedTy, /*usePlaceholder=*/false, OS);
121-
unsigned DescriptionLength = SS.size() - DescriptionBegin;
122-
StringRef Description(SS.begin() + DescriptionBegin, DescriptionLength);
133+
memberElem.DescriptionLength = SS.size() - memberElem.DescriptionBegin;
123134

124135
// Sourcetext.
125-
unsigned SourceTextBegin = SS.size();
136+
memberElem.SourceTextBegin = SS.size();
126137
SwiftLangSupport::printMemberDeclDescription(
127138
member, Item.ExpectedTy, /*usePlaceholder=*/true, OS);
128-
unsigned SourceTextLength = SS.size() - SourceTextBegin;
129-
StringRef SourceText(SS.begin() + SourceTextBegin, SourceTextLength);
139+
memberElem.SourceTextLength = SS.size() - memberElem.SourceTextBegin;
130140

131141
// DocBrief.
132-
StringRef BriefComment;
133142
auto MaybeClangNode = member->getClangNode();
134143
if (MaybeClangNode) {
135144
if (auto *D = MaybeClangNode.getAsDecl()) {
136145
const auto &ClangContext = D->getASTContext();
137146
if (const clang::RawComment *RC =
138147
ClangContext.getRawCommentForAnyRedecl(D))
139-
BriefComment = RC->getBriefText(ClangContext);
148+
memberElem.BriefComment = RC->getBriefText(ClangContext);
140149
}
141150
} else {
142-
BriefComment = member->getBriefComment();
151+
memberElem.BriefComment = member->getBriefComment();
143152
}
144-
145-
ImplicitMembers.push_back(
146-
{DeclNameStr, Description, SourceText, BriefComment});
147153
}
148154

149155
SourceKit::TypeContextInfoItem Info;
156+
SmallVector<SourceKit::TypeContextInfoItem::Member, 8> SKImplicitMembers;
157+
158+
for (auto &info : ImplicitMembers) {
159+
StringRef Name(SS.begin() + info.DeclNameBegin, info.DeclNameLength);
160+
StringRef Description(SS.begin() + info.DescriptionBegin,
161+
info.DescriptionLength);
162+
StringRef SourceText(SS.begin() + info.SourceTextBegin,
163+
info.SourceTextLength);
164+
SKImplicitMembers.push_back(
165+
{Name, Description, SourceText, info.BriefComment});
166+
}
167+
150168
Info.TypeName = StringRef(SS.begin() + TypeNameBegin, TypeNameLength);
151169
Info.TypeUSR = StringRef(SS.begin() + TypeUSRBegin, TypeUSRLength);
152-
Info.ImplicitMembers = ImplicitMembers;
170+
Info.ImplicitMembers = SKImplicitMembers;
153171

154172
SKConsumer.handleResult(Info);
155173
}

0 commit comments

Comments
 (0)