From 61749b91c4fb59bf22c7e4ec9f777adf9d90d878 Mon Sep 17 00:00:00 2001 From: "Ryan M. L. McFadden" Date: Mon, 17 Jun 2024 10:51:44 -0300 Subject: [PATCH] fix segfault This patch provides a memory-safe alternative to the changes introduced in commit 418adfde670b8d911a6a313e11a2ee4fc98feeee, which causes a segfault when the "batch mode" flag is required (i.e., for ascii/graphic export). Note: the program name (i.e., argv[0]) has been added the list arguments passed to ROOT's TApplication. This ensures that the TApplication name matches that of the program (see https://github.com/root-project/root/blob/542b98b2ccca760fd83117b750b89d81b8e9b926/core/base/src/TApplication.cxx#L179-L180). --- src/musrFT.cpp | 15 +++++++-------- src/musrview.cpp | 15 ++++++++------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/musrFT.cpp b/src/musrFT.cpp index a2d50364..a9bf6ca1 100644 --- a/src/musrFT.cpp +++ b/src/musrFT.cpp @@ -1437,19 +1437,18 @@ Int_t main(Int_t argc, Char_t *argv[]) musrFT_dumpData(startupParam.dumpFln, fourier, startupParam.fourierRange[0], startupParam.fourierRange[1]); } else { // do Canvas - // if Fourier graphical export is whished, switch to batch mode + // if Fourier graphical export is wished, switch to batch mode Bool_t batch = false; - int cc=0; - char **arg; + // create list of essential arguments to pass to the ROOT application + std::vector args; + args.push_back(argv[0]); // program name if (startupParam.graphicFormat.Length() != 0) { batch = true; - arg[cc] = (Char_t*)malloc(16*sizeof(Char_t)); - strcpy(arg[cc], "-b"); - cc++; + args.push_back((char*)"-b"); // batch mode flag } - + int cc = args.size(); // plot the Fourier transform - TApplication app("App", &cc, arg); + TApplication app("App", &cc, args.data()); if (startupHandler) { fourierCanvas = std::unique_ptr(new PFourierCanvas(fourier, dataSetTag, startupParam.title.Data(), diff --git a/src/musrview.cpp b/src/musrview.cpp index b76383e0..69ba93d7 100644 --- a/src/musrview.cpp +++ b/src/musrview.cpp @@ -37,6 +37,7 @@ #include #include +#include #include #include @@ -301,15 +302,15 @@ int main(int argc, char *argv[]) } if (result == PMUSR_SUCCESS) { - // generate Root application needed for PMusrCanvas - int cc=0; - char **arg; + // create the ROOT application needed for PMusrCanvas + // and pass it only essential arguments + std::vector args; + args.push_back(argv[0]); // program name if (graphicsOutput || asciiOutput) { - arg[cc] = (char*)malloc(16*sizeof(char)); - strcpy(arg[cc], "-b"); - cc++; + args.push_back((char*)"-b"); // batch mode flag } - TApplication app("App", &cc, arg); + int cc = args.size(); + TApplication app("App", &cc, args.data()); std::vector canvasVector; PMusrCanvas *musrCanvas;