@@ -2109,13 +2109,6 @@ TProcessID *TFile::ReadProcessID(UShort_t pidf)
21092109
21102110Int_t TFile::Recover ()
21112111{
2112- Short_t keylen,cycle;
2113- UInt_t datime;
2114- Int_t nbytes,date,time,objlen,nwheader;
2115- Long64_t seekkey,seekpdir;
2116- char header[1024 ];
2117- char *buffer, *bufread;
2118- char nwhc;
21192112 Long64_t idcur = fBEGIN ;
21202113
21212114 Long64_t size;
@@ -2129,10 +2122,11 @@ Int_t TFile::Recover()
21292122 if (fWritable && !fFree ) fFree = new TList;
21302123
21312124 Int_t nrecov = 0 ;
2132- nwheader = 1024 ;
2133- Int_t nread = nwheader;
21342125
21352126 while (idcur < fEND ) {
2127+ char header[1024 ];
2128+ int nread = sizeof (header);
2129+
21362130 Seek (idcur); // NOLINT: silence clang-tidy warnings
21372131 if (idcur+nread >= fEND ) nread = fEND -idcur-1 ;
21382132 if (ReadBuffer (header, nread)) { // NOLINT: silence clang-tidy warnings
@@ -2141,8 +2135,8 @@ Int_t TFile::Recover()
21412135 GetName (),idcur);
21422136 break ;
21432137 }
2144- buffer = header;
2145- bufread = header ;
2138+ char *buffer = header;
2139+ Int_t nbytes ;
21462140 frombuf (buffer, &nbytes);
21472141 if (!nbytes) {
21482142 Error (" Recover" ," Address = %lld\t Nbytes = %d\t =====E R R O R=======" , idcur, nbytes);
@@ -2156,10 +2150,15 @@ Int_t TFile::Recover()
21562150 }
21572151 Version_t versionkey;
21582152 frombuf (buffer, &versionkey);
2153+ Int_t objlen;
21592154 frombuf (buffer, &objlen);
2155+ UInt_t datime;
21602156 frombuf (buffer, &datime);
2157+ Short_t keylen;
21612158 frombuf (buffer, &keylen);
2159+ Short_t cycle;
21622160 frombuf (buffer, &cycle);
2161+ Long64_t seekkey, seekpdir;
21632162 if (versionkey > 1000 ) {
21642163 frombuf (buffer, &seekkey);
21652164 frombuf (buffer, &seekpdir);
@@ -2168,13 +2167,15 @@ Int_t TFile::Recover()
21682167 frombuf (buffer, &skey); seekkey = (Long64_t)skey;
21692168 frombuf (buffer, &sdir); seekpdir = (Long64_t)sdir;
21702169 }
2171- frombuf (buffer, &nwhc);
2172- char *classname = nullptr ;
2173- if (nwhc <= 0 || nwhc > 100 ) break ;
2174- classname = new char [nwhc+1 ];
2175- int i, nwhci = nwhc;
2176- for (i = 0 ;i < nwhc; i++) frombuf (buffer, &classname[i]);
2177- classname[nwhci] = ' \0 ' ;
2170+ char classnameLen;
2171+ frombuf (buffer, &classnameLen);
2172+ char classname[101 ];
2173+ if (classnameLen <= 0 || classnameLen > (Int_t)sizeof (classname))
2174+ break ;
2175+ memcpy (classname, buffer, classnameLen);
2176+ buffer += classnameLen;
2177+ classname[static_cast <std::size_t >(classnameLen)] = ' \0 ' ;
2178+ Int_t date, time;
21782179 TDatime::GetDateTime (datime, date, time);
21792180 TClass *tclass = TClass::GetClass (classname);
21802181 if (seekpdir == fSeekDir && tclass && !tclass->InheritsFrom (TFile::Class ())
@@ -2194,7 +2195,6 @@ Int_t TFile::Recover()
21942195 Info (" Recover" , " %s, recovered key %s:%s at address %lld" ,GetName (),key->GetClassName (),key->GetName (),idcur);
21952196 }
21962197 }
2197- delete [] classname;
21982198 idcur += nbytes;
21992199 }
22002200 if (fWritable ) {
0 commit comments