]> granicus.if.org Git - llvm/commitdiff
[llvm-objcopy] Improve --add-section argument string parsing
authorSergey Dmitriev <serguei.n.dmitriev@intel.com>
Mon, 29 Jul 2019 16:22:40 +0000 (16:22 +0000)
committerSergey Dmitriev <serguei.n.dmitriev@intel.com>
Mon, 29 Jul 2019 16:22:40 +0000 (16:22 +0000)
Differential Revision: https://reviews.llvm.org/D65346

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

test/tools/llvm-objcopy/COFF/add-section.test
test/tools/llvm-objcopy/ELF/add-section.test
tools/llvm-objcopy/COFF/COFFObjcopy.cpp
tools/llvm-objcopy/CopyConfig.cpp

index f2aa5ef093dcf8dfdec15efeace9be9eda743f45..4422e31a99c4ae25599ee424196837065f71d5d6 100644 (file)
 
 ## Test that llvm-objcopy produces an error if the file with section contents
 ## to be added does not exist.
-# RUN: not llvm-objcopy --add-section=.another.section=%t2 %t %t3 2>&1 | FileCheck -DFILE=%t -DFILE1=%t2 %s --check-prefixes=CHECK-ERR1
+# RUN: not llvm-objcopy --add-section=.another.section=%t2 %t %t3 2>&1 | FileCheck -DFILE1=%t -DFILE2=%t2 %s --check-prefixes=ERR1
 
-# CHECK-ERR1: llvm-objcopy{{(.exe)?}}: error: '[[FILE]]': '[[FILE1]]': {{[Nn]}}o such file or directory
+# ERR1: error: '[[FILE1]]': '[[FILE2]]': {{[Nn]}}o such file or directory
 
 ## Another negative test for invalid --add-sections command line argument.
-# RUN: not llvm-objcopy --add-section=.another.section %t %t3 2>&1 | FileCheck -DFILE=%t %s --check-prefixes=CHECK-ERR2
+# RUN: not llvm-objcopy --add-section=.another.section %t %t3 2>&1 | FileCheck %s --check-prefixes=ERR2
 
-# CHECK-ERR2: llvm-objcopy{{(.exe)?}}: error: '[[FILE]]': bad format for --add-section
+# ERR2: error: bad format for --add-section: missing '='
+
+## Negative test for invalid --add-sections argument - missing file name.
+# RUN: not llvm-objcopy --add-section=.section.name= %t %t3 2>&1 | FileCheck %s --check-prefixes=ERR3
+
+# ERR3: error: bad format for --add-section: missing file name
 
 --- !COFF
 header:
index bf3ffdb090ef0ce04e3a32571bd742df58f8ea3a..4acbd9ae4e22621fe7c4af727e7c355e5965ba50 100644 (file)
@@ -35,3 +35,19 @@ Sections:
 # CHECK: SectionData (
 # CHECK-NEXT:   0000: DEADBEEF
 # CHECK-NEXT: )
+
+## Test that llvm-objcopy produces an error if the file with section contents
+## to be added does not exist.
+# RUN: not llvm-objcopy --add-section=.section.name=%t.missing %t %t.out 2>&1 | FileCheck -DFILE1=%t -DFILE2=%t.missing %s --check-prefixes=ERR1
+
+# ERR1: error: '[[FILE1]]': '[[FILE2]]': {{[Nn]}}o such file or directory
+
+## Negative test for invalid --add-sections argument - missing '='.
+# RUN: not llvm-objcopy --add-section=.section.name %t %t.out 2>&1 | FileCheck %s --check-prefixes=ERR2
+
+# ERR2: error: bad format for --add-section: missing '='
+
+## Negative test for invalid --add-sections argument - missing file name.
+# RUN: not llvm-objcopy --add-section=.section.name= %t %t.out 2>&1 | FileCheck %s --check-prefixes=ERR3
+
+# ERR3: error: bad format for --add-section: missing file name
index b0474a0f0f4eee5f272314cb7c99dfbc5d9c7cad..d30bea0b35f131aff90c8eab9c88ffca43d1a74e 100644 (file)
@@ -186,9 +186,6 @@ static Error handleArgs(const CopyConfig &Config, Object &Obj) {
     StringRef SecName, FileName;
     std::tie(SecName, FileName) = Flag.split("=");
 
-    if (FileName.empty())
-      return createStringError(llvm::errc::invalid_argument,
-                               "bad format for --add-section");
     auto BufOrErr = MemoryBuffer::getFile(FileName);
     if (!BufOrErr)
       return createFileError(FileName, errorCodeToError(BufOrErr.getError()));
index 8d6431b3044f2ccc0934d270b4016d516cae072e..4001aac4ed479f62eef0372d1bc795b2e479239d 100644 (file)
@@ -617,8 +617,17 @@ Expected<DriverConfig> parseObjcopyOptions(ArrayRef<const char *> ArgsArr) {
     Config.KeepSection.emplace_back(Arg->getValue(), UseRegex);
   for (auto Arg : InputArgs.filtered(OBJCOPY_only_section))
     Config.OnlySection.emplace_back(Arg->getValue(), UseRegex);
-  for (auto Arg : InputArgs.filtered(OBJCOPY_add_section))
-    Config.AddSection.push_back(Arg->getValue());
+  for (auto Arg : InputArgs.filtered(OBJCOPY_add_section)) {
+    StringRef ArgValue(Arg->getValue());
+    if (!ArgValue.contains('='))
+      return createStringError(errc::invalid_argument,
+                               "bad format for --add-section: missing '='");
+    if (ArgValue.split("=").second.empty())
+      return createStringError(
+          errc::invalid_argument,
+          "bad format for --add-section: missing file name");
+    Config.AddSection.push_back(ArgValue);
+  }
   for (auto Arg : InputArgs.filtered(OBJCOPY_dump_section))
     Config.DumpSection.push_back(Arg->getValue());
   Config.StripAll = InputArgs.hasArg(OBJCOPY_strip_all);