diff --git a/clang/include/clang/Basic/DiagnosticDriverKinds.td b/clang/include/clang/Basic/DiagnosticDriverKinds.td --- a/clang/include/clang/Basic/DiagnosticDriverKinds.td +++ b/clang/include/clang/Basic/DiagnosticDriverKinds.td @@ -278,6 +278,8 @@ DefaultError; def err_invalid_macos_32bit_deployment_target : Error< "32-bit targets are not supported when building for Mac Catalyst">; +def err_invalid_ssp_buffer_size : Error< + "ssp buffer size is not valid">; def err_drv_invalid_os_in_arg : Error<"invalid OS value '%0' in '%1'">; def err_drv_conflicting_deployment_targets : Error< "conflicting deployment targets, both '%0' and '%1' are present in environment">; diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -3187,14 +3187,27 @@ CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel))); } + auto IsInteger = [](StringRef Str) -> bool { + if (Str.empty()) + return false; + for (auto &Chr : Str) + if (Chr < '0' || Chr > '9') + return false; + return true; + }; + // --param ssp-buffer-size= for (const Arg *A : Args.filtered(options::OPT__param)) { StringRef Str(A->getValue()); - if (Str.startswith("ssp-buffer-size=")) { + auto StrSplit = Str.split('='); + if (StrSplit.first.equals("ssp-buffer-size")) { if (StackProtectorLevel) { - CmdArgs.push_back("-stack-protector-buffer-size"); - // FIXME: Verify the argument is a valid integer. - CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16))); + if (IsInteger(StrSplit.second)) { + CmdArgs.push_back("-stack-protector-buffer-size"); + CmdArgs.push_back(Args.MakeArgString(StrSplit.second)); + } else { + D.Diag(clang::diag::err_invalid_ssp_buffer_size); + } } A->claim(); }