[llvm] r333565 - [dsymutil] Escape HTML special characters in plist.

Jonas Devlieghere via llvm-commits llvm-commits at lists.llvm.org
Wed May 30 10:47:11 PDT 2018


Author: jdevlieghere
Date: Wed May 30 10:47:11 2018
New Revision: 333565

URL: http://llvm.org/viewvc/llvm-project?rev=333565&view=rev
Log:
[dsymutil] Escape HTML special characters in plist.

When printing string in the Plist, we weren't escaping the characters
which lead to invalid XML. This patch adds the escape logic to
StringExtras.

rdar://39785334

Modified:
    llvm/trunk/include/llvm/ADT/StringExtras.h
    llvm/trunk/lib/Support/StringExtras.cpp
    llvm/trunk/test/tools/dsymutil/X86/darwin-bundle.test
    llvm/trunk/tools/dsymutil/dsymutil.cpp

Modified: llvm/trunk/include/llvm/ADT/StringExtras.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/StringExtras.h?rev=333565&r1=333564&r2=333565&view=diff
==============================================================================
--- llvm/trunk/include/llvm/ADT/StringExtras.h (original)
+++ llvm/trunk/include/llvm/ADT/StringExtras.h Wed May 30 10:47:11 2018
@@ -255,6 +255,10 @@ inline StringRef getOrdinalSuffix(unsign
 /// it if it is not printable or if it is an escape char.
 void PrintEscapedString(StringRef Name, raw_ostream &Out);
 
+/// Print each character of the specified string, escaping HTML special
+/// characters.
+void PrintHTMLEscaped(StringRef String, raw_ostream &Out);
+
 /// printLowerCase - Print each character as lowercase if it is uppercase.
 void printLowerCase(StringRef String, raw_ostream &Out);
 

Modified: llvm/trunk/lib/Support/StringExtras.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/StringExtras.cpp?rev=333565&r1=333564&r2=333565&view=diff
==============================================================================
--- llvm/trunk/lib/Support/StringExtras.cpp (original)
+++ llvm/trunk/lib/Support/StringExtras.cpp Wed May 30 10:47:11 2018
@@ -68,6 +68,23 @@ void llvm::PrintEscapedString(StringRef
   }
 }
 
+void llvm::PrintHTMLEscaped(StringRef String, raw_ostream &Out) {
+  for (char C : String) {
+    if (C == '&')
+      Out << "&";
+    else if (C == '<')
+      Out << "<";
+    else if (C == '>')
+      Out << ">";
+    else if (C == '\"')
+      Out << """;
+    else if (C == '\'')
+      Out << "'";
+    else
+      Out << C;
+  }
+}
+
 void llvm::printLowerCase(StringRef String, raw_ostream &Out) {
   for (const char C : String)
     Out << toLower(C);

Modified: llvm/trunk/test/tools/dsymutil/X86/darwin-bundle.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/dsymutil/X86/darwin-bundle.test?rev=333565&r1=333564&r2=333565&view=diff
==============================================================================
--- llvm/trunk/test/tools/dsymutil/X86/darwin-bundle.test (original)
+++ llvm/trunk/test/tools/dsymutil/X86/darwin-bundle.test Wed May 30 10:47:11 2018
@@ -8,7 +8,7 @@ RUN: cat %p/../Inputs/Info.plist > %t/In
 RUN: dsymutil -oso-prepend-path=%p/.. %t/basic.macho.x86_64 -o %t/dsymdest/basic.macho.x86_64.dSYM
 RUN: FileCheck %s --input-file %t/dsymdest/basic.macho.x86_64.dSYM/Contents/Info.plist
 
-RUN: dsymutil -oso-prepend-path=%p/.. %t/basic.macho.x86_64 -toolchain "toolchain" -o %t/dsymdest/basic.macho.x86_64.dSYM
+RUN: dsymutil -oso-prepend-path=%p/.. %t/basic.macho.x86_64 -toolchain "toolchain&and'some<symbols" -o %t/dsymdest/basic.macho.x86_64.dSYM
 RUN: FileCheck %s --input-file %t/dsymdest/basic.macho.x86_64.dSYM/Contents/Info.plist --check-prefix=CHECK --check-prefix=TOOLCHAIN
 
 CHECK: <?xml version="1.0" encoding="UTF-8"?>
@@ -30,6 +30,6 @@ CHECK-NEXT:                 <string>2.0<
 CHECK-NEXT:                 <key>CFBundleVersion</key>
 CHECK-NEXT:                 <string>2</string>
 TOOLCHAIN:                  <key>Toolchain</key>
-TOOLCHAIN-NEXT:             <string>toolchain</string>
+TOOLCHAIN-NEXT:             <string>toolchain&and'some<symbols</string>
 CHECK:              </dict>
 CHECK-NEXT: </plist>

Modified: llvm/trunk/tools/dsymutil/dsymutil.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/dsymutil/dsymutil.cpp?rev=333565&r1=333564&r2=333565&view=diff
==============================================================================
--- llvm/trunk/tools/dsymutil/dsymutil.cpp (original)
+++ llvm/trunk/tools/dsymutil/dsymutil.cpp Wed May 30 10:47:11 2018
@@ -18,6 +18,7 @@
 #include "MachOUtils.h"
 #include "llvm/ADT/SmallString.h"
 #include "llvm/ADT/SmallVector.h"
+#include "llvm/ADT/StringExtras.h"
 #include "llvm/ADT/StringRef.h"
 #include "llvm/ADT/Triple.h"
 #include "llvm/DebugInfo/DIContext.h"
@@ -193,16 +194,24 @@ static bool createPlistFile(llvm::String
      << "\t\t<key>CFBundleSignature</key>\n"
      << "\t\t<string>\?\?\?\?</string>\n";
 
-  if (!BI.OmitShortVersion())
-    PL << "\t\t<key>CFBundleShortVersionString</key>\n"
-       << "\t\t<string>" << BI.ShortVersionStr << "</string>\n";
-
-  PL << "\t\t<key>CFBundleVersion</key>\n"
-     << "\t\t<string>" << BI.VersionStr << "</string>\n";
-
-  if (!Toolchain.empty())
-    PL << "\t\t<key>Toolchain</key>\n"
-       << "\t\t<string>" << Toolchain << "</string>\n";
+  if (!BI.OmitShortVersion()) {
+    PL << "\t\t<key>CFBundleShortVersionString</key>\n";
+    PL << "\t\t<string>";
+    PrintHTMLEscaped(BI.ShortVersionStr, PL);
+    PL << "</string>\n";
+  }
+
+  PL << "\t\t<key>CFBundleVersion</key>\n";
+  PL << "\t\t<string>";
+  PrintHTMLEscaped(BI.VersionStr, PL);
+  PL << "</string>\n";
+
+  if (!Toolchain.empty()) {
+    PL << "\t\t<key>Toolchain</key>\n";
+    PL << "\t\t<string>";
+    PrintHTMLEscaped(Toolchain, PL);
+    PL << "</string>\n";
+  }
 
   PL << "\t</dict>\n"
      << "</plist>\n";




More information about the llvm-commits mailing list