@@ -2100,13 +2100,6 @@ TProcessID *TFile::ReadProcessID(UShort_t pidf)
21002100
21012101Int_t TFile::Recover ()
21022102{
2103- Short_t keylen,cycle;
2104- UInt_t datime;
2105- Int_t nbytes,date,time,objlen,nwheader;
2106- Long64_t seekkey,seekpdir;
2107- char header[1024 ];
2108- char *buffer, *bufread;
2109- char nwhc;
21102103 Long64_t idcur = fBEGIN ;
21112104
21122105 Long64_t size;
@@ -2120,10 +2113,11 @@ Int_t TFile::Recover()
21202113 if (fWritable && !fFree ) fFree = new TList;
21212114
21222115 Int_t nrecov = 0 ;
2123- nwheader = 1024 ;
2124- Int_t nread = nwheader;
21252116
21262117 while (idcur < fEND ) {
2118+ char header[1024 ];
2119+ int nread = sizeof (header);
2120+
21272121 Seek (idcur); // NOLINT: silence clang-tidy warnings
21282122 if (idcur+nread >= fEND ) nread = fEND -idcur-1 ;
21292123 if (ReadBuffer (header, nread)) { // NOLINT: silence clang-tidy warnings
@@ -2132,8 +2126,9 @@ Int_t TFile::Recover()
21322126 GetName (),idcur);
21332127 break ;
21342128 }
2135- buffer = header;
2136- bufread = header;
2129+ char *buffer = header;
2130+ char *bufread = header;
2131+ Int_t nbytes;
21372132 frombuf (buffer, &nbytes);
21382133 if (!nbytes) {
21392134 Error (" Recover" ," Address = %lld\t Nbytes = %d\t =====E R R O R=======" , idcur, nbytes);
@@ -2147,10 +2142,15 @@ Int_t TFile::Recover()
21472142 }
21482143 Version_t versionkey;
21492144 frombuf (buffer, &versionkey);
2145+ Int_t objlen;
21502146 frombuf (buffer, &objlen);
2147+ UInt_t datime;
21512148 frombuf (buffer, &datime);
2149+ Short_t keylen;
21522150 frombuf (buffer, &keylen);
2151+ Short_t cycle;
21532152 frombuf (buffer, &cycle);
2153+ Long64_t seekkey, seekpdir;
21542154 if (versionkey > 1000 ) {
21552155 frombuf (buffer, &seekkey);
21562156 frombuf (buffer, &seekpdir);
@@ -2159,13 +2159,15 @@ Int_t TFile::Recover()
21592159 frombuf (buffer, &skey); seekkey = (Long64_t)skey;
21602160 frombuf (buffer, &sdir); seekpdir = (Long64_t)sdir;
21612161 }
2162- frombuf (buffer, &nwhc);
2163- char *classname = nullptr ;
2164- if (nwhc <= 0 || nwhc > 100 ) break ;
2165- classname = new char [nwhc+1 ];
2166- int i, nwhci = nwhc;
2167- for (i = 0 ;i < nwhc; i++) frombuf (buffer, &classname[i]);
2168- classname[nwhci] = ' \0 ' ;
2162+ char classnameLen;
2163+ frombuf (buffer, &classnameLen);
2164+ char classname[101 ];
2165+ if (classnameLen <= 0 || classnameLen > (Int_t)sizeof (classname))
2166+ break ;
2167+ memcpy (classname, buffer, classnameLen);
2168+ buffer += classnameLen;
2169+ classname[static_cast <std::size_t >(classnameLen)] = ' \0 ' ;
2170+ Int_t date, time;
21692171 TDatime::GetDateTime (datime, date, time);
21702172 TClass *tclass = TClass::GetClass (classname);
21712173 if (seekpdir == fSeekDir && tclass && !tclass->InheritsFrom (TFile::Class ())
@@ -2184,7 +2186,6 @@ Int_t TFile::Recover()
21842186 Info (" Recover" , " %s, recovered key %s:%s at address %lld" ,GetName (),key->GetClassName (),key->GetName (),idcur);
21852187 }
21862188 }
2187- delete [] classname;
21882189 idcur += nbytes;
21892190 }
21902191 if (fWritable ) {
0 commit comments