Skip to content

Commit e105aca

Browse files
authored
Merge pull request #68371 from hamishknight/fix-leak-5.9
[5.9] Fix 5.9 LSAN leak
2 parents c3553a7 + 0d5586c commit e105aca

File tree

4 files changed

+25
-5
lines changed

4 files changed

+25
-5
lines changed

lib/ASTGen/Sources/ASTGen/Diagnostics.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -444,7 +444,7 @@ public func addQueuedDiagnostic(
444444

445445
/// Render the queued diagnostics into a UTF-8 string.
446446
@_cdecl("swift_ASTGen_renderQueuedDiagnostics")
447-
public func renterQueuedDiagnostics(
447+
public func renderQueuedDiagnostics(
448448
queuedDiagnosticsPtr: UnsafeMutablePointer<UInt8>,
449449
contextSize: Int,
450450
colorize: Int,

lib/ASTGen/Sources/ASTGen/Macros.swift

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,11 @@ func allocateUTF8String(
167167
}
168168
}
169169

170+
@_cdecl("swift_ASTGen_freeString")
171+
public func freeString(pointer: UnsafePointer<UInt8>?) {
172+
pointer?.deallocate()
173+
}
174+
170175
/// Diagnostics produced here.
171176
enum ASTGenMacroDiagnostic: DiagnosticMessage, FixItMessage {
172177
case thrownError(Error)
@@ -410,6 +415,14 @@ func checkMacroDefinition(
410415
}
411416
}
412417

418+
@_cdecl("swift_ASTGen_freeExpansionReplacements")
419+
public func freeExpansionReplacements(
420+
pointer: UnsafeMutablePointer<Int>?,
421+
numReplacements: Int
422+
) {
423+
UnsafeMutableBufferPointer(start: pointer, count: numReplacements).deallocate()
424+
}
425+
413426
// Make an expansion result for '@_cdecl' function caller.
414427
func makeExpansionOutputResult(
415428
expandedSource: String?,

lib/Frontend/PrintingDiagnosticConsumer.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ extern "C" void swift_ASTGen_addQueuedDiagnostic(
5454
extern "C" void swift_ASTGen_renderQueuedDiagnostics(
5555
void *queued, ptrdiff_t contextSize, ptrdiff_t colorize,
5656
char **outBuffer, ptrdiff_t *outBufferLength);
57+
extern "C" void swift_ASTGen_freeString(const char *str);
5758

5859
// FIXME: Hack because we cannot easily get to the already-parsed source
5960
// file from here. Fix this egregious oversight!
@@ -1198,6 +1199,7 @@ void PrintingDiagnosticConsumer::flush(bool includeTrailingBreak) {
11981199
&renderedString, &renderedStringLen);
11991200
if (renderedString) {
12001201
Stream.write(renderedString, renderedStringLen);
1202+
swift_ASTGen_freeString(renderedString);
12011203
}
12021204
swift_ASTGen_destroyQueuedDiagnostics(queuedDiagnostics);
12031205
queuedDiagnostics = nullptr;

lib/Sema/TypeCheckMacros.cpp

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ using namespace swift;
4949
extern "C" void *swift_ASTGen_resolveMacroType(const void *macroType);
5050
extern "C" void swift_ASTGen_destroyMacro(void *macro);
5151

52+
extern "C" void swift_ASTGen_freeString(const char *str);
53+
5254
extern "C" void *swift_ASTGen_resolveExecutableMacro(
5355
const char *moduleName, ptrdiff_t moduleNameLength,
5456
const char *typeName, ptrdiff_t typeNameLength,
@@ -64,6 +66,9 @@ extern "C" ptrdiff_t swift_ASTGen_checkMacroDefinition(
6466
ptrdiff_t **replacementsPtr,
6567
ptrdiff_t *numReplacements
6668
);
69+
extern "C" void swift_ASTGen_freeExpansionReplacements(
70+
ptrdiff_t *replacementsPtr,
71+
ptrdiff_t numReplacements);
6772

6873
extern "C" ptrdiff_t swift_ASTGen_expandFreestandingMacro(
6974
void *diagEngine, void *macro, uint8_t externalKind,
@@ -197,8 +202,8 @@ MacroDefinition MacroDefinitionRequest::evaluate(
197202

198203
// Clean up after the call.
199204
SWIFT_DEFER {
200-
free(externalMacroNamePtr);
201-
free(replacements);
205+
swift_ASTGen_freeString(externalMacroNamePtr);
206+
swift_ASTGen_freeExpansionReplacements(replacements, numReplacements);
202207
};
203208

204209
if (checkResult < 0 && ctx.CompletionCallback) {
@@ -1054,7 +1059,7 @@ evaluateFreestandingMacro(FreestandingMacroExpansion *expansion,
10541059
evaluatedSource = llvm::MemoryBuffer::getMemBufferCopy(
10551060
{evaluatedSourceAddress, (size_t)evaluatedSourceLength},
10561061
adjustMacroExpansionBufferName(*discriminator));
1057-
free((void *)evaluatedSourceAddress);
1062+
swift_ASTGen_freeString(evaluatedSourceAddress);
10581063
break;
10591064
#else
10601065
ctx.Diags.diagnose(loc, diag::macro_unsupported);
@@ -1333,7 +1338,7 @@ static SourceFile *evaluateAttachedMacro(MacroDecl *macro, Decl *attachedTo,
13331338
evaluatedSource = llvm::MemoryBuffer::getMemBufferCopy(
13341339
{evaluatedSourceAddress, (size_t)evaluatedSourceLength},
13351340
adjustMacroExpansionBufferName(*discriminator));
1336-
free((void *)evaluatedSourceAddress);
1341+
swift_ASTGen_freeString(evaluatedSourceAddress);
13371342
break;
13381343
#else
13391344
attachedTo->diagnose(diag::macro_unsupported);

0 commit comments

Comments
 (0)