Skip to content

Commit c323880

Browse files
committed
[io] Properly abort when buffer size overflows max integer
Fixes #14770 [io] add more checks in TBuffer functions as suggested by jblomer
1 parent c4b3303 commit c323880

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

82 files changed

+452
-353
lines changed

core/base/inc/TBuffer.h

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -64,9 +64,9 @@ class TBuffer : public TObject {
6464
void operator=(const TBuffer &) = delete;
6565

6666
Int_t Read(const char *name) override { return TObject::Read(name); }
67-
Int_t Write(const char *name, Int_t opt, Int_t bufsize) override
67+
Int_t Write(const char *name, Int_t opt, Long64_t bufsize) override
6868
{ return TObject::Write(name, opt, bufsize); }
69-
Int_t Write(const char *name, Int_t opt, Int_t bufsize) const override
69+
Int_t Write(const char *name, Int_t opt, Long64_t bufsize) const override
7070
{ return TObject::Write(name, opt, bufsize); }
7171

7272
public:
@@ -78,53 +78,53 @@ class TBuffer : public TObject {
7878
enum { kInitialSize = 1024, kMinimalSize = 128 };
7979

8080
TBuffer(EMode mode);
81-
TBuffer(EMode mode, Int_t bufsize);
82-
TBuffer(EMode mode, Int_t bufsize, void *buf, Bool_t adopt = kTRUE, ReAllocCharFun_t reallocfunc = nullptr);
81+
TBuffer(EMode mode, Long64_t bufsize);
82+
TBuffer(EMode mode, Long64_t bufsize, void *buf, Bool_t adopt = kTRUE, ReAllocCharFun_t reallocfunc = nullptr);
8383
virtual ~TBuffer();
8484

8585
Int_t GetBufferVersion() const { return fVersion; }
8686
Bool_t IsReading() const { return (fMode & kWrite) == 0; }
8787
Bool_t IsWriting() const { return (fMode & kWrite) != 0; }
8888
void SetReadMode();
8989
void SetWriteMode();
90-
void SetBuffer(void *buf, UInt_t bufsize = 0, Bool_t adopt = kTRUE, ReAllocCharFun_t reallocfunc = nullptr);
90+
void SetBuffer(void *buf, Long64_t bufsize = 0, Bool_t adopt = kTRUE, ReAllocCharFun_t reallocfunc = nullptr);
9191
ReAllocCharFun_t GetReAllocFunc() const;
9292
void SetReAllocFunc(ReAllocCharFun_t reallocfunc = nullptr);
93-
void SetBufferOffset(Int_t offset = 0) { fBufCur = fBuffer+offset; }
93+
void SetBufferOffset(Long64_t offset = 0) { fBufCur = fBuffer+offset; }
9494
void SetParent(TObject *parent);
9595
TObject *GetParent() const;
9696
char *Buffer() const { return fBuffer; }
9797
char *GetCurrent() const { return fBufCur; }
9898
Int_t BufferSize() const { return fBufSize; }
9999
void DetachBuffer() { fBuffer = nullptr; }
100100
Int_t Length() const { return (Int_t)(fBufCur - fBuffer); }
101-
void Expand(Int_t newsize, Bool_t copy = kTRUE); // expand buffer to newsize
102-
void AutoExpand(Int_t size_needed); // expand buffer to newsize
101+
void Expand(Long64_t newsize, Bool_t copy = kTRUE); // expand buffer to newsize
102+
void AutoExpand(Long64_t size_needed); // expand buffer to newsize
103103
Bool_t ByteSwapBuffer(Long64_t n, EDataType type); // Byte-swap N primitive-elements in the buffer
104104

105105
virtual Bool_t CheckObject(const TObject *obj) = 0;
106106
virtual Bool_t CheckObject(const void *obj, const TClass *ptrClass) = 0;
107107

108-
virtual Int_t ReadBuf(void *buf, Int_t max) = 0;
109-
virtual void WriteBuf(const void *buf, Int_t max) = 0;
108+
virtual Long64_t ReadBuf(void *buf, Long64_t max) = 0;
109+
virtual void WriteBuf(const void *buf, Long64_t max) = 0;
110110

111-
virtual char *ReadString(char *s, Int_t max) = 0;
111+
virtual char *ReadString(char *s, Long64_t max) = 0;
112112
virtual void WriteString(const char *s) = 0;
113113

114114
virtual Int_t GetVersionOwner() const = 0;
115115
virtual Int_t GetMapCount() const = 0;
116116
virtual void GetMappedObject(UInt_t tag, void* &ptr, TClass* &ClassPtr) const = 0;
117-
virtual void MapObject(const TObject *obj, UInt_t offset = 1) = 0;
118-
virtual void MapObject(const void *obj, const TClass *cl, UInt_t offset = 1) = 0;
117+
virtual void MapObject(const TObject *obj, ULong64_t offset = 1) = 0;
118+
virtual void MapObject(const void *obj, const TClass *cl, ULong64_t offset = 1) = 0;
119119
virtual void Reset() = 0;
120120
virtual void InitMap() = 0;
121121
virtual void ResetMap() = 0;
122122
virtual void SetReadParam(Int_t mapsize) = 0;
123123
virtual void SetWriteParam(Int_t mapsize) = 0;
124124

125-
virtual Int_t CheckByteCount(UInt_t startpos, UInt_t bcnt, const TClass *clss) = 0;
126-
virtual Int_t CheckByteCount(UInt_t startpos, UInt_t bcnt, const char *classname) = 0;
127-
virtual void SetByteCount(UInt_t cntpos, Bool_t packInVersion = kFALSE)= 0;
125+
virtual Long64_t CheckByteCount(ULong64_t startpos, ULong64_t bcnt, const TClass *clss) = 0;
126+
virtual Long64_t CheckByteCount(ULong64_t startpos, ULong64_t bcnt, const char *classname) = 0;
127+
virtual void SetByteCount(ULong64_t cntpos, Bool_t packInVersion = kFALSE)= 0;
128128

129129
virtual void SkipVersion(const TClass *cl = nullptr) = 0;
130130
virtual Version_t ReadVersion(UInt_t *start = nullptr, UInt_t *bcnt = nullptr, const TClass *cl = nullptr) = 0;
@@ -164,7 +164,7 @@ class TBuffer : public TObject {
164164
virtual void SetPidOffset(UShort_t offset) = 0;
165165
virtual Int_t GetBufferDisplacement() const = 0;
166166
virtual void SetBufferDisplacement() = 0;
167-
virtual void SetBufferDisplacement(Int_t skipped) = 0;
167+
virtual void SetBufferDisplacement(Long64_t skipped) = 0;
168168

169169
// basic types and arrays of basic types
170170
virtual void ReadFloat16 (Float_t *f, TStreamerElement *ele = nullptr) = 0;
@@ -320,8 +320,8 @@ class TBuffer : public TObject {
320320
// Utilities for TStreamerInfo
321321
virtual void ForceWriteInfo(TVirtualStreamerInfo *info, Bool_t force) = 0;
322322
virtual void ForceWriteInfoClones(TClonesArray *a) = 0;
323-
virtual Int_t ReadClones (TClonesArray *a, Int_t nobjects, Version_t objvers) = 0;
324-
virtual Int_t WriteClones(TClonesArray *a, Int_t nobjects) = 0;
323+
virtual Int_t ReadClones (TClonesArray *a, Long64_t nobjects, Version_t objvers) = 0;
324+
virtual Int_t WriteClones(TClonesArray *a, Long64_t nobjects) = 0;
325325

326326
// Utilities for TClass
327327
virtual Int_t ReadClassEmulated(const TClass *cl, void *object, const TClass *onfile_class = nullptr) = 0;

core/base/inc/TDirectory.h

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -254,20 +254,20 @@ can be replaced with the simpler and exception safe:
254254
virtual void Save() {}
255255
virtual Int_t SaveObjectAs(const TObject * /*obj*/, const char * /*filename*/="", Option_t * /*option*/="") const;
256256
virtual void SaveSelf(Bool_t /*force*/ = kFALSE) {}
257-
virtual void SetBufferSize(Int_t /* bufsize */) {}
257+
virtual void SetBufferSize(Long64_t /* bufsize */) {}
258258
virtual void SetModified() {}
259259
virtual void SetMother(TObject *mother) {fMother = (TObject*)mother;}
260260
void SetName(const char* newname) override;
261261
virtual void SetTRefAction(TObject * /*ref*/, TObject * /*parent*/) {}
262262
virtual void SetSeekDir(Long64_t) {}
263263
virtual void SetWritable(Bool_t) {}
264264
Int_t Sizeof() const override {return 0;}
265-
virtual Int_t Write(const char * /*name*/=nullptr, Int_t /*opt*/=0, Int_t /*bufsize*/=0) override {return 0;}
266-
virtual Int_t Write(const char * /*name*/=nullptr, Int_t /*opt*/=0, Int_t /*bufsize*/=0) const override {return 0;}
267-
virtual Int_t WriteTObject(const TObject *obj, const char *name =nullptr, Option_t * /*option*/="", Int_t /*bufsize*/ =0);
265+
virtual Int_t Write(const char * /*name*/=nullptr, Int_t /*opt*/=0, Long64_t /*bufsize*/=0) override {return 0;}
266+
virtual Int_t Write(const char * /*name*/=nullptr, Int_t /*opt*/=0, Long64_t /*bufsize*/=0) const override {return 0;}
267+
virtual Int_t WriteTObject(const TObject *obj, const char *name =nullptr, Option_t * /*option*/="", Long64_t /*bufsize*/ =0);
268268
private:
269269
/// \cond HIDDEN_SYMBOLS
270-
Int_t WriteObject(void *obj, const char* name, Option_t *option="", Int_t bufsize=0); // Intentionally not implemented.
270+
Int_t WriteObject(void *obj, const char* name, Option_t *option="", Long64_t bufsize=0); // Intentionally not implemented.
271271
/// \endcond
272272
public:
273273
/// \brief Write an object with proper type checking.
@@ -280,7 +280,7 @@ can be replaced with the simpler and exception safe:
280280
/// from TObject. The method redirects to TDirectory::WriteObjectAny.
281281
template <typename T>
282282
inline std::enable_if_t<!std::is_base_of<TObject, T>::value, Int_t>
283-
WriteObject(const T *obj, const char *name, Option_t *option = "", Int_t bufsize = 0)
283+
WriteObject(const T *obj, const char *name, Option_t *option = "", Long64_t bufsize = 0)
284284
{
285285
return WriteObjectAny(obj, TClass::GetClass<T>(), name, option, bufsize);
286286
}
@@ -294,12 +294,12 @@ can be replaced with the simpler and exception safe:
294294
/// TObject. The method redirects to TDirectory::WriteTObject.
295295
template <typename T>
296296
inline std::enable_if_t<std::is_base_of<TObject, T>::value, Int_t>
297-
WriteObject(const T *obj, const char *name, Option_t *option = "", Int_t bufsize = 0)
297+
WriteObject(const T *obj, const char *name, Option_t *option = "", Long64_t bufsize = 0)
298298
{
299299
return WriteTObject(obj, name, option, bufsize);
300300
}
301-
virtual Int_t WriteObjectAny(const void *, const char * /*classname*/, const char * /*name*/, Option_t * /*option*/="", Int_t /*bufsize*/ =0) {return 0;}
302-
virtual Int_t WriteObjectAny(const void *, const TClass * /*cl*/, const char * /*name*/, Option_t * /*option*/="", Int_t /*bufsize*/ =0) {return 0;}
301+
virtual Int_t WriteObjectAny(const void *, const char * /*classname*/, const char * /*name*/, Option_t * /*option*/="", Long64_t /*bufsize*/ =0) {return 0;}
302+
virtual Int_t WriteObjectAny(const void *, const TClass * /*cl*/, const char * /*name*/, Option_t * /*option*/="", Long64_t /*bufsize*/ =0) {return 0;}
303303
virtual void WriteDirHeader() {}
304304
virtual void WriteKeys() {}
305305

core/base/inc/TObject.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -170,8 +170,8 @@ class TObject {
170170
virtual void SetDrawOption(Option_t *option=""); // *MENU*
171171
virtual void SetUniqueID(UInt_t uid);
172172
virtual void UseCurrentStyle();
173-
virtual Int_t Write(const char *name = nullptr, Int_t option = 0, Int_t bufsize = 0);
174-
virtual Int_t Write(const char *name = nullptr, Int_t option = 0, Int_t bufsize = 0) const;
173+
virtual Int_t Write(const char *name = nullptr, Int_t option = 0, Long64_t bufsize = 0);
174+
virtual Int_t Write(const char *name = nullptr, Int_t option = 0, Long64_t bufsize = 0) const;
175175

176176
/// IsDestructed
177177
///

core/base/src/TBuffer.cxx

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -69,10 +69,10 @@ TBuffer::TBuffer(EMode mode)
6969
/// Create an I/O buffer object. Mode should be either TBuffer::kRead or
7070
/// TBuffer::kWrite.
7171

72-
TBuffer::TBuffer(EMode mode, Int_t bufsize)
72+
TBuffer::TBuffer(EMode mode, Long64_t bufsize)
7373
{
74-
if (bufsize < 0)
75-
Fatal("TBuffer","Request to create a buffer with a negative size, likely due to an integer overflow: 0x%x for a max of 0x%x.", bufsize, kMaxBufferSize);
74+
if (bufsize > kMaxBufferSize)
75+
Fatal("TBuffer","Request to create a too large buffer: 0x%llx for a max of 0x%x.", bufsize, kMaxBufferSize);
7676
if (bufsize < kMinimalSize) bufsize = kMinimalSize;
7777
fBufSize = bufsize;
7878
fMode = mode;
@@ -100,10 +100,10 @@ TBuffer::TBuffer(EMode mode, Int_t bufsize)
100100
/// is provided, a Fatal error will be issued if the Buffer attempts to
101101
/// expand.
102102

103-
TBuffer::TBuffer(EMode mode, Int_t bufsize, void *buf, Bool_t adopt, ReAllocCharFun_t reallocfunc)
103+
TBuffer::TBuffer(EMode mode, Long64_t bufsize, void *buf, Bool_t adopt, ReAllocCharFun_t reallocfunc)
104104
{
105-
if (bufsize < 0)
106-
Fatal("TBuffer","Request to create a buffer with a negative size, likely due to an integer overflow: 0x%x for a max of 0x%x.", bufsize, kMaxBufferSize);
105+
if (bufsize > kMaxBufferSize)
106+
Fatal("TBuffer","Request to create a too large buffer: 0x%llx for a max of 0x%x.", bufsize, kMaxBufferSize);
107107
fBufSize = bufsize;
108108
fMode = mode;
109109
fVersion = 0;
@@ -154,10 +154,10 @@ TBuffer::~TBuffer()
154154
/// If the size_needed is larger than the current size, the policy
155155
/// is to expand to double the current size or the size_needed which ever is largest.
156156

157-
void TBuffer::AutoExpand(Int_t size_needed)
157+
void TBuffer::AutoExpand(Long64_t size_needed)
158158
{
159-
if (size_needed < 0) {
160-
Fatal("AutoExpand","Request to expand to a negative size, likely due to an integer overflow: 0x%x for a max of 0x%x.", size_needed, kMaxBufferSize);
159+
if (size_needed > kMaxBufferSize) {
160+
Fatal("AutoExpand","Request to expand a too large buffer: 0x%llx for a max of 0x%x.", size_needed, kMaxBufferSize);
161161
}
162162
if (size_needed > fBufSize) {
163163
Long64_t doubling = 2LLU * fBufSize;
@@ -183,8 +183,10 @@ void TBuffer::AutoExpand(Int_t size_needed)
183183
/// is provided, a Fatal error will be issued if the Buffer attempts to
184184
/// expand.
185185

186-
void TBuffer::SetBuffer(void *buf, UInt_t newsiz, Bool_t adopt, ReAllocCharFun_t reallocfunc)
186+
void TBuffer::SetBuffer(void *buf, Long64_t newsiz, Bool_t adopt, ReAllocCharFun_t reallocfunc)
187187
{
188+
if (newsiz > kMaxBufferSize)
189+
Fatal("SetBuffer","Request to create a too large buffer: 0x%llx for a max of 0x%x.", newsiz, kMaxBufferSize);
188190
if (fBuffer && TestBit(kIsOwner))
189191
delete [] fBuffer;
190192

@@ -219,19 +221,19 @@ void TBuffer::SetBuffer(void *buf, UInt_t newsiz, Bool_t adopt, ReAllocCharFun_t
219221
/// In order to avoid losing data, if the current length is greater than
220222
/// the requested size, we only shrink down to the current length.
221223

222-
void TBuffer::Expand(Int_t newsize, Bool_t copy)
224+
void TBuffer::Expand(Long64_t newsize, Bool_t copy)
223225
{
224226
Int_t l = Length();
225-
if ( (l > newsize) && copy ) {
227+
if ( (Long64_t(l) > newsize) && copy ) {
226228
newsize = l;
227229
}
228230
const Int_t extraspace = (fMode&kWrite)!=0 ? kExtraSpace : 0;
229231

230-
if ( ((Long64_t)newsize+extraspace) > kMaxBufferSize) {
232+
if ( newsize > kMaxBufferSize - kExtraSpace) {
231233
if (l < kMaxBufferSize) {
232234
newsize = kMaxBufferSize - extraspace;
233235
} else {
234-
Fatal("Expand","Requested size (%d) is too large (max is %d).", newsize, kMaxBufferSize);
236+
Fatal("Expand","Requested size (%lld) is too large (max is %d).", newsize, kMaxBufferSize);
235237
}
236238
}
237239
if ( (fMode&kWrite)!=0 ) {

core/base/src/TDirectory.cxx

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -342,11 +342,12 @@ static TBuffer* R__CreateBuffer()
342342
if (!creator) {
343343
R__LOCKGUARD(gROOTMutex);
344344
TClass *c = TClass::GetClass("TBufferFile");
345-
TMethod *m = c->GetMethodWithPrototype("TBufferFile","TBuffer::EMode,Int_t",kFALSE,ROOT::kExactMatch);
345+
TMethod *m = c->GetMethodWithPrototype("TBufferFile","TBuffer::EMode,Long64_t",kFALSE,ROOT::kExactMatch);
346+
assert(m != nullptr);
346347
creator = (tcling_callfunc_Wrapper_t)( m->InterfaceMethod() );
347348
}
348349
TBuffer::EMode mode = TBuffer::kWrite;
349-
Int_t size = 10000;
350+
Long64_t size = 10000;
350351
void *args[] = { &mode, &size };
351352
TBuffer *result;
352353
creator(nullptr,2,args,&result);
@@ -1423,9 +1424,9 @@ void TDirectory::RegisterGDirectory(TDirectory::SharedGDirectory_t &gdirectory_p
14231424
}
14241425

14251426
////////////////////////////////////////////////////////////////////////////////
1426-
/// \copydoc TDirectoryFile::WriteObject(const T*,const char*,Option_t*,Int_t).
1427+
/// \copydoc TDirectoryFile::WriteObject(const T*,const char*,Option_t*,Long64_t).
14271428

1428-
Int_t TDirectory::WriteTObject(const TObject *obj, const char *name, Option_t * /*option*/, Int_t /*bufsize*/)
1429+
Int_t TDirectory::WriteTObject(const TObject *obj, const char *name, Option_t * /*option*/, Long64_t /*bufsize*/)
14291430
{
14301431
const char *objname = "no name specified";
14311432
if (name) objname = name;

core/base/src/TObject.cxx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -939,7 +939,7 @@ void TObject::UseCurrentStyle()
939939
/// The function returns the total number of bytes written to the file.
940940
/// It returns 0 if the object cannot be written.
941941

942-
Int_t TObject::Write(const char *name, Int_t option, Int_t bufsize) const
942+
Int_t TObject::Write(const char *name, Int_t option, Long64_t bufsize) const
943943
{
944944
if (R__unlikely(option & kOnlyPrepStep))
945945
return 0;
@@ -961,7 +961,7 @@ Int_t TObject::Write(const char *name, Int_t option, Int_t bufsize) const
961961
/// Write this object to the current directory. For more see the
962962
/// const version of this method.
963963

964-
Int_t TObject::Write(const char *name, Int_t option, Int_t bufsize)
964+
Int_t TObject::Write(const char *name, Int_t option, Long64_t bufsize)
965965
{
966966
return ((const TObject*)this)->Write(name, option, bufsize);
967967
}

core/cont/inc/TCollection.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -207,8 +207,8 @@ class TCollection : public TObject {
207207
void SetName(const char *name) { fName = name; }
208208
virtual void SetOwner(Bool_t enable = kTRUE);
209209
virtual bool UseRWLock(Bool_t enable = true);
210-
Int_t Write(const char *name = nullptr, Int_t option = 0, Int_t bufsize = 0) override;
211-
Int_t Write(const char *name = nullptr, Int_t option = 0, Int_t bufsize = 0) const override;
210+
Int_t Write(const char *name = nullptr, Int_t option = 0, Long64_t bufsize = 0) override;
211+
Int_t Write(const char *name = nullptr, Int_t option = 0, Long64_t bufsize = 0) const override;
212212

213213
R__ALWAYS_INLINE Bool_t IsUsingRWLock() const { return TestBit(TCollection::kUseRWLock); }
214214

core/cont/inc/TMap.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,8 @@ friend class TMapIter;
8484
TPair *RemoveEntry(TObject *key);
8585
virtual void SetOwnerValue(Bool_t enable = kTRUE);
8686
virtual void SetOwnerKeyValue(Bool_t ownkeys = kTRUE, Bool_t ownvals = kTRUE);
87-
Int_t Write(const char *name=nullptr, Int_t option=0, Int_t bufsize=0) override;
88-
Int_t Write(const char *name=nullptr, Int_t option=0, Int_t bufsize=0) const override;
87+
Int_t Write(const char *name=nullptr, Int_t option=0, Long64_t bufsize=0) override;
88+
Int_t Write(const char *name=nullptr, Int_t option=0, Long64_t bufsize=0) const override;
8989

9090
ClassDefOverride(TMap,3) //A (key,value) map
9191
};

core/cont/src/TCollection.cxx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -676,7 +676,7 @@ void TCollection::Streamer(TBuffer &b)
676676
/// objects using a single key specify a name and set option to
677677
/// TObject::kSingleKey (i.e. 1).
678678

679-
Int_t TCollection::Write(const char *name, Int_t option, Int_t bufsize) const
679+
Int_t TCollection::Write(const char *name, Int_t option, Long64_t bufsize) const
680680
{
681681
if ((option & kSingleKey)) {
682682
return TObject::Write(name, option, bufsize);
@@ -700,7 +700,7 @@ Int_t TCollection::Write(const char *name, Int_t option, Int_t bufsize) const
700700
/// objects using a single key specify a name and set option to
701701
/// TObject::kSingleKey (i.e. 1).
702702

703-
Int_t TCollection::Write(const char *name, Int_t option, Int_t bufsize)
703+
Int_t TCollection::Write(const char *name, Int_t option, Long64_t bufsize)
704704
{
705705
return ((const TCollection*)this)->Write(name,option,bufsize);
706706
}

core/cont/src/TMap.cxx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -401,7 +401,7 @@ void TMap::Streamer(TBuffer &b)
401401
/// objects using a single key specify a name and set option to
402402
/// TObject::kSingleKey (i.e. 1).
403403

404-
Int_t TMap::Write(const char *name, Int_t option, Int_t bufsize) const
404+
Int_t TMap::Write(const char *name, Int_t option, Long64_t bufsize) const
405405
{
406406
if ((option & kSingleKey)) {
407407
return TObject::Write(name, option, bufsize);
@@ -428,7 +428,7 @@ Int_t TMap::Write(const char *name, Int_t option, Int_t bufsize) const
428428
/// objects using a single key specify a name and set option to
429429
/// TObject::kSingleKey (i.e. 1).
430430

431-
Int_t TMap::Write(const char *name, Int_t option, Int_t bufsize)
431+
Int_t TMap::Write(const char *name, Int_t option, Long64_t bufsize)
432432
{
433433
return ((const TMap*)this)->Write(name,option,bufsize);
434434
}

0 commit comments

Comments
 (0)