]> granicus.if.org Git - llvm/commitdiff
[dsymutil] Fix heap-use-after-free related to the LinkOptions.
authorJonas Devlieghere <jonas@devlieghere.com>
Thu, 1 Aug 2019 23:37:33 +0000 (23:37 +0000)
committerJonas Devlieghere <jonas@devlieghere.com>
Thu, 1 Aug 2019 23:37:33 +0000 (23:37 +0000)
In r367348, I changed dsymutil to pass the LinkOptions by value isntead
of by const reference. However, the options were still captured by
reference in the LinkLambda. This patch fixes that by passing them in by
value.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@367635 91177308-0d34-0410-b5e6-96231b3b80d8

tools/dsymutil/dsymutil.cpp

index 60ba14325549424a5d5cec2ff08e57f373f108de..759b5e4e26ccfc9433752c051da0fa01bfbefdbe 100644 (file)
@@ -591,9 +591,10 @@ int main(int argc, char **argv) {
         }
       }
 
-      auto LinkLambda = [&,
-                         OutputFile](std::shared_ptr<raw_fd_ostream> Stream) {
-        AllOK.fetch_and(linkDwarf(*Stream, BinHolder, *Map, *OptionsOrErr));
+      auto LinkLambda = [&, OutputFile](std::shared_ptr<raw_fd_ostream> Stream,
+                                        LinkOptions Options) {
+        AllOK.fetch_and(
+            linkDwarf(*Stream, BinHolder, *Map, std::move(Options)));
         Stream->flush();
         if (Verify && !NoOutput)
           AllOK.fetch_and(verify(OutputFile, Map->getTriple().getArchName()));
@@ -603,9 +604,9 @@ int main(int argc, char **argv) {
       // out the (significantly smaller) stack when using threads. We don't
       // want this limitation when we only have a single thread.
       if (ThreadCount == 1)
-        LinkLambda(OS);
+        LinkLambda(OS, *OptionsOrErr);
       else
-        Threads.async(LinkLambda, OS);
+        Threads.async(LinkLambda, OS, *OptionsOrErr);
     }
 
     Threads.wait();