1010#include < TMemFile.h>
1111#include < TNamed.h>
1212#include < TTree.h>
13+ #include < TTreeCacheUnzip.h>
1314
1415#include < cstring>
1516#include < memory>
@@ -165,7 +166,7 @@ TEST(RZip, CorruptHeaderTKey)
165166 EXPECT_TRUE (verifyFile.Get <TNamed>(" tnamed" ));
166167}
167168
168- TEST (RZip, CorruptHeaderTBasket )
169+ TEST (RZip, CorruptHeaderTTree )
169170{
170171 TMemFile writableFile (" memfile.root" , " RECREATE" );
171172 writableFile.SetCompressionSettings (101 );
@@ -178,13 +179,15 @@ TEST(RZip, CorruptHeaderTBasket)
178179
179180 auto keysInfo = writableFile.WalkTKeys ();
180181 std::size_t posTBasket = 0 ;
182+ std::size_t keylenTBasket = 0 ;
181183 for (const auto &ki : keysInfo) {
182184 if (ki.fClassName != " TBasket" )
183185 continue ;
184186
185187 EXPECT_EQ (0u , posTBasket); // We expect only one basket
186188 EXPECT_LT (ki.fLen , ki.fObjLen ); // ensure it's compressed
187189 posTBasket = ki.fSeekKey + ki.fKeyLen ;
190+ keylenTBasket = ki.fKeyLen ;
188191 }
189192 EXPECT_GT (posTBasket, 0 );
190193
@@ -207,6 +210,27 @@ TEST(RZip, CorruptHeaderTBasket)
207210 buffer[posTBasket + headerOffset]--;
208211 }
209212
213+ {
214+ TMemFile verifyFile (" memfile.root" , TMemFile::ZeroCopyView_t (buffer.get (), writableFile.GetSize ()));
215+
216+ tree = verifyFile.Get <TTree>(" t" );
217+
218+ TTreeCacheUnzip cache (tree);
219+ char *dest = nullptr ;
220+
221+ for (int headerOffset : {3 , 6 }) {
222+ ROOT::TestSupport::CheckDiagsRAII checkDiag;
223+ checkDiag.requiredDiag (kError , " TTreeCacheUnzip::UnzipBuffer" , " nbytes" , /* matchFullMessage= */ false );
224+
225+ buffer[posTBasket + headerOffset]++;
226+ EXPECT_EQ (-1 , cache.UnzipBuffer (&dest, &buffer[posTBasket - keylenTBasket]));
227+ buffer[posTBasket + headerOffset]--;
228+ }
229+
230+ EXPECT_GT (cache.UnzipBuffer (&dest, &buffer[posTBasket - keylenTBasket]), 0 );
231+ delete[] dest;
232+ }
233+
210234 TMemFile verifyFile (" memfile.root" , TMemFile::ZeroCopyView_t (buffer.get (), writableFile.GetSize ()));
211235 tree = verifyFile.Get <TTree>(" t" );
212236 tree->SetBranchAddress (" val" , &val);
0 commit comments