From: Eli Friedman Date: Thu, 29 Aug 2013 01:42:42 +0000 (+0000) Subject: Properly escape filenames in line directives. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3432b7800d447267f4353e70a319f6f5a0bb4aab;p=clang Properly escape filenames in line directives. Fixes PR17018. Only partial test coverage because I don't want to try to write a test which generates a file whose name contains a newline. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@189557 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Frontend/PrintPreprocessedOutput.cpp b/lib/Frontend/PrintPreprocessedOutput.cpp index 83b2a271ec..e0ec08fb90 100644 --- a/lib/Frontend/PrintPreprocessedOutput.cpp +++ b/lib/Frontend/PrintPreprocessedOutput.cpp @@ -190,11 +190,11 @@ void PrintPPOutputPPCallbacks::WriteLineInfo(unsigned LineNo, // Emit #line directives or GNU line markers depending on what mode we're in. if (UseLineDirective) { OS << "#line" << ' ' << LineNo << ' ' << '"'; - OS.write(CurFilename.data(), CurFilename.size()); + OS.write_escaped(CurFilename); OS << '"'; } else { OS << '#' << ' ' << LineNo << ' ' << '"'; - OS.write(CurFilename.data(), CurFilename.size()); + OS.write_escaped(CurFilename); OS << '"'; if (ExtraLen) @@ -285,7 +285,6 @@ void PrintPPOutputPPCallbacks::FileChanged(SourceLocation Loc, CurFilename.clear(); CurFilename += UserLoc.getFilename(); - Lexer::Stringify(CurFilename); FileType = NewFileType; if (DisableLineMarkers) { diff --git a/lib/Rewrite/Frontend/InclusionRewriter.cpp b/lib/Rewrite/Frontend/InclusionRewriter.cpp index a2297f9179..3fba6905e1 100644 --- a/lib/Rewrite/Frontend/InclusionRewriter.cpp +++ b/lib/Rewrite/Frontend/InclusionRewriter.cpp @@ -114,7 +114,9 @@ void InclusionRewriter::WriteLineInfo(const char *Filename, int Line, } else { // Use GNU linemarkers as described here: // http://gcc.gnu.org/onlinedocs/cpp/Preprocessor-Output.html - OS << '#' << ' ' << Line << ' ' << '"' << Filename << '"'; + OS << '#' << ' ' << Line << ' ' << '"'; + OS.write_escaped(Filename); + OS << '"'; if (!Extra.empty()) OS << Extra; if (FileType == SrcMgr::C_System) diff --git a/test/Preprocessor/line-directive-output.c b/test/Preprocessor/line-directive-output.c index bd3ea949eb..5c0aef8b32 100644 --- a/test/Preprocessor/line-directive-output.c +++ b/test/Preprocessor/line-directive-output.c @@ -73,3 +73,6 @@ extern int z; # 42 "A.c" # 44 "A.c" # 49 "A.c" + +// CHECK: # 50 "a\n.c" +# 50 "a\012.c"