@@ -2101,13 +2101,6 @@ TProcessID *TFile::ReadProcessID(UShort_t pidf)
21012101
21022102Int_t TFile::Recover ()
21032103{
2104- Short_t keylen,cycle;
2105- UInt_t datime;
2106- Int_t nbytes,date,time,objlen,nwheader;
2107- Long64_t seekkey,seekpdir;
2108- char header[1024 ];
2109- char *buffer, *bufread;
2110- char nwhc;
21112104 Long64_t idcur = fBEGIN ;
21122105
21132106 Long64_t size;
@@ -2121,10 +2114,11 @@ Int_t TFile::Recover()
21212114 if (fWritable && !fFree ) fFree = new TList;
21222115
21232116 Int_t nrecov = 0 ;
2124- nwheader = 1024 ;
2125- Int_t nread = nwheader;
21262117
21272118 while (idcur < fEND ) {
2119+ char header[1024 ];
2120+ int nread = sizeof (header);
2121+
21282122 Seek (idcur); // NOLINT: silence clang-tidy warnings
21292123 if (idcur+nread >= fEND ) nread = fEND -idcur-1 ;
21302124 if (ReadBuffer (header, nread)) { // NOLINT: silence clang-tidy warnings
@@ -2133,8 +2127,8 @@ Int_t TFile::Recover()
21332127 GetName (),idcur);
21342128 break ;
21352129 }
2136- buffer = header;
2137- bufread = header ;
2130+ char *buffer = header;
2131+ Int_t nbytes ;
21382132 frombuf (buffer, &nbytes);
21392133 if (!nbytes) {
21402134 Error (" Recover" ," Address = %lld\t Nbytes = %d\t =====E R R O R=======" , idcur, nbytes);
@@ -2148,10 +2142,15 @@ Int_t TFile::Recover()
21482142 }
21492143 Version_t versionkey;
21502144 frombuf (buffer, &versionkey);
2145+ Int_t objlen;
21512146 frombuf (buffer, &objlen);
2147+ UInt_t datime;
21522148 frombuf (buffer, &datime);
2149+ Short_t keylen;
21532150 frombuf (buffer, &keylen);
2151+ Short_t cycle;
21542152 frombuf (buffer, &cycle);
2153+ Long64_t seekkey, seekpdir;
21552154 if (versionkey > 1000 ) {
21562155 frombuf (buffer, &seekkey);
21572156 frombuf (buffer, &seekpdir);
@@ -2160,13 +2159,15 @@ Int_t TFile::Recover()
21602159 frombuf (buffer, &skey); seekkey = (Long64_t)skey;
21612160 frombuf (buffer, &sdir); seekpdir = (Long64_t)sdir;
21622161 }
2163- frombuf (buffer, &nwhc);
2164- char *classname = nullptr ;
2165- if (nwhc <= 0 || nwhc > 100 ) break ;
2166- classname = new char [nwhc+1 ];
2167- int i, nwhci = nwhc;
2168- for (i = 0 ;i < nwhc; i++) frombuf (buffer, &classname[i]);
2169- 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;
21702171 TDatime::GetDateTime (datime, date, time);
21712172 TClass *tclass = TClass::GetClass (classname);
21722173 if (seekpdir == fSeekDir && tclass && !tclass->InheritsFrom (TFile::Class ())
@@ -2186,7 +2187,6 @@ Int_t TFile::Recover()
21862187 Info (" Recover" , " %s, recovered key %s:%s at address %lld" ,GetName (),key->GetClassName (),key->GetName (),idcur);
21872188 }
21882189 }
2189- delete [] classname;
21902190 idcur += nbytes;
21912191 }
21922192 if (fWritable ) {
0 commit comments