Skip to content

Commit 668624f

Browse files
committed
[io] Cleanup a bit TFile::Recover
- Declare variables when they're used - Spare a needless dynamic allocation - Use memcpy instead of frombuf in a loop
1 parent a75ffa9 commit 668624f

1 file changed

Lines changed: 20 additions & 19 deletions

File tree

io/io/src/TFile.cxx

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2100,13 +2100,6 @@ TProcessID *TFile::ReadProcessID(UShort_t pidf)
21002100

21012101
Int_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\tNbytes = %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

Comments
 (0)