[ELF] addLibrary: fix a use-after-free bug in archiveName
authorFangrui Song <i@maskray.me>
Tue, 26 Jul 2022 21:36:56 +0000 (14:36 -0700)
committerFangrui Song <i@maskray.me>
Tue, 26 Jul 2022 21:36:57 +0000 (14:36 -0700)
It manifests as an incorrect name in --print-archive-stats=.

lld/ELF/Driver.cpp
lld/test/ELF/print-archive-stats.s

index 36d4e3b..6c0fd31 100644 (file)
@@ -290,7 +290,7 @@ void LinkerDriver::addFile(StringRef path, bool withLOption) {
 // Add a given library by searching it from input search paths.
 void LinkerDriver::addLibrary(StringRef name) {
   if (Optional<std::string> path = searchLibrary(name))
-    addFile(*path, /*withLOption=*/true);
+    addFile(saver().save(*path), /*withLOption=*/true);
   else
     error("unable to find library -l" + name, ErrorTag::LibNotFound, {name});
 }
index eb1ce5e..61e571e 100644 (file)
 # RUN: ld.lld a.o %t/weak.a 1.a --print-archive-stats=- -o /dev/null | diff a.txt -
 
 ## The second 1.a has 0 fetched member.
-# RUN: ld.lld a.o %t/weak.a 1.a 1.a --print-archive-stats=- -o /dev/null | \
+# RUN: ld.lld a.o %t/weak.a -L. -l:1.a -l:1.a --print-archive-stats=- -o /dev/null | \
 # RUN:   FileCheck --check-prefix=CHECK2 %s
 # CHECK2:      members extracted       archive
 # CHECK2-NEXT: 1       0       {{.*}}weak.a
-# CHECK2-NEXT: 3       2       1.a
-# CHECK2-NEXT: 3       0       1.a
+# CHECK2-NEXT: 3       2       {{.*}}1.a
+# CHECK2-NEXT: 3       0       {{.*}}1.a
 
 # RUN: not ld.lld -shared a.o --print-archive-stats=/ -o /dev/null 2>&1 | FileCheck --check-prefix=ERR %s
 # ERR: error: --print-archive-stats=: cannot open /: {{.*}}