From cb248f8c2a79fbddfdfed0039390e49512410a80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Storsj=C3=B6?= Date: Mon, 24 Jun 2024 20:02:39 +0300 Subject: [LLD] [COFF] Don't crash on an empty -entry: argument (#96058) We can't pass an empty string to addUndefined(). This fixes the crash that was encountered in https://github.com/llvm/llvm-project/issues/93309 (turning the crash into a properly handled error; making it do the right thing is handled in https://github.com/llvm/llvm-project/pull/96055). --- lld/COFF/Driver.cpp | 4 ++++ lld/test/COFF/invalid-entry.s | 20 ++++++++++++++++++++ 2 files changed, 24 insertions(+) create mode 100644 lld/test/COFF/invalid-entry.s diff --git a/lld/COFF/Driver.cpp b/lld/COFF/Driver.cpp index 1755017..cef6271 100644 --- a/lld/COFF/Driver.cpp +++ b/lld/COFF/Driver.cpp @@ -413,6 +413,8 @@ void LinkerDriver::parseDirectives(InputFile *file) { enqueuePath(*path, false, false); break; case OPT_entry: + if (!arg->getValue()[0]) + fatal("missing entry point symbol name"); ctx.config.entry = addUndefined(mangle(arg->getValue())); break; case OPT_failifmismatch: @@ -2249,6 +2251,8 @@ void LinkerDriver::linkerMain(ArrayRef argsArr) { { llvm::TimeTraceScope timeScope("Entry point"); if (auto *arg = args.getLastArg(OPT_entry)) { + if (!arg->getValue()[0]) + fatal("missing entry point symbol name"); config->entry = addUndefined(mangle(arg->getValue())); } else if (!config->entry && !config->noEntry) { if (args.hasArg(OPT_dll)) { diff --git a/lld/test/COFF/invalid-entry.s b/lld/test/COFF/invalid-entry.s new file mode 100644 index 0000000..8973dfb --- /dev/null +++ b/lld/test/COFF/invalid-entry.s @@ -0,0 +1,20 @@ +# REQUIRES: x86 +# RUN: split-file %s %t.dir && cd %t.dir + +# RUN: llvm-mc -filetype=obj -triple=x86_64-windows test.s -o test.obj +# RUN: llvm-mc -filetype=obj -triple=x86_64-windows drectve.s -o drectve.obj + +# RUN: env LLD_IN_TEST=1 not lld-link -out:out.dll test.obj -dll -entry: 2>&1 | FileCheck %s +# RUN: env LLD_IN_TEST=1 not lld-link -out:out.dll test.obj -dll drectve.obj 2>&1 | FileCheck %s + +# CHECK: error: missing entry point symbol name + +#--- test.s + .text + .globl func +func: + ret + +#--- drectve.s + .section .drectve, "yn" + .ascii " -entry:" -- cgit v1.1