Bug fix: AliHLTComponent::ConfigureFromArgumentString
authortbreitne <tbreitne@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 3 Dec 2013 09:36:38 +0000 (09:36 +0000)
committertbreitne <tbreitne@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 3 Dec 2013 09:36:38 +0000 (09:36 +0000)
ptrarray is filled with c_str pointers from strings in stringarray. Occasionally, the stringarray vector may do a reallocation during push_back, rendering the pointers already stored in ptrarray invalid. Now ptrarray is filled after the tokenizing loop.

HLT/BASE/AliHLTComponent.cxx

index 959cb1a..ebcdba1 100644 (file)
@@ -469,7 +469,7 @@ int AliHLTComponent::ConfigureFromArgumentString(int argc, const char** argv)
     // the argument is a single argument, just having whitespaces at the end.
     argument.Remove(0, argument.First(' '));
     if (argument.IsWhitespace()) {
-      ptrarray.push_back(argv[i]);
+      stringarray.push_back(argv[i]);
       continue;
     }
 
@@ -493,7 +493,6 @@ int AliHLTComponent::ConfigureFromArgumentString(int argc, const char** argv)
            // every second entry is enclosed by quotes and thus
            // one single argument
            stringarray.push_back(argument.Data());
-           ptrarray.push_back(stringarray.back().c_str());
          } else {
     TObjArray* pTokens=argument.Tokenize(" ");
     if (pTokens) {
@@ -502,7 +501,6 @@ int AliHLTComponent::ConfigureFromArgumentString(int argc, const char** argv)
          TString data=pTokens->At(n)->GetName();
          if (!data.IsNull() && !data.IsWhitespace()) {
            stringarray.push_back(data.Data());
-           ptrarray.push_back(stringarray.back().c_str());
          }
        }
       }
@@ -515,6 +513,13 @@ int AliHLTComponent::ConfigureFromArgumentString(int argc, const char** argv)
     }
   }
 
+  // fill ptrarray; should be safe at this point
+  // since stringarray isn't modified any further
+  unsigned int idx;
+  for(idx=0; idx<stringarray.size(); ++idx) {
+    ptrarray.push_back(stringarray.at(idx).c_str());
+  }
+
   for (i=0; (unsigned)i<ptrarray.size() && iResult>=0;) {
     int result=ScanConfigurationArgument(ptrarray.size()-i, &ptrarray[i]);
     if (result==0) {