Merge pull request #285 from D4N/ub_memleak_fixes

Fix some undefined behavior and memory leaks
v0.27.3
D4N 7 years ago committed by GitHub
commit 368771f3fd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -526,7 +526,7 @@ namespace Exiv2 {
// Pimpl idiom // Pimpl idiom
class Impl; class Impl;
Impl* p_; std::auto_ptr<Impl> p_;
}; // class FileIo }; // class FileIo
@ -726,7 +726,7 @@ namespace Exiv2 {
// Pimpl idiom // Pimpl idiom
class Impl; class Impl;
Impl* p_; std::auto_ptr<Impl> p_;
}; // class MemIo }; // class MemIo

@ -312,7 +312,7 @@ namespace Exiv2 {
private: private:
// Pimpl idiom // Pimpl idiom
struct Impl; struct Impl;
Impl* p_; std::auto_ptr<Impl> p_;
}; // class XmpKey }; // class XmpKey

@ -222,7 +222,7 @@ namespace Exiv2 {
private: private:
// Pimpl idiom // Pimpl idiom
struct Impl; struct Impl;
Impl* p_; std::auto_ptr<Impl> p_;
}; // class ExifKey }; // class ExifKey

@ -160,7 +160,7 @@ namespace Exiv2 {
private: private:
// Pimpl idiom // Pimpl idiom
struct Impl; struct Impl;
Impl* p_; std::auto_ptr<Impl> p_;
}; // class Xmpdatum }; // class Xmpdatum
@ -179,6 +179,9 @@ namespace Exiv2 {
*/ */
class EXIV2API XmpData { class EXIV2API XmpData {
public: public:
//! Default constructor
XmpData() : xmpMetadata_(), xmpPacket_(), usePacket_(0) {}
//! XmpMetadata iterator type //! XmpMetadata iterator type
typedef XmpMetadata::iterator iterator; typedef XmpMetadata::iterator iterator;
//! XmpMetadata const iterator type //! XmpMetadata const iterator type

@ -371,7 +371,6 @@ namespace Exiv2 {
FileIo::~FileIo() FileIo::~FileIo()
{ {
close(); close();
delete p_;
} }
int FileIo::munmap() int FileIo::munmap()
@ -1092,9 +1091,9 @@ namespace Exiv2 {
void MemIo::Impl::reserve(long wcount) void MemIo::Impl::reserve(long wcount)
{ {
long need = wcount + idx_; const long need = wcount + idx_;
long blockSize = 32*1024; // 32768 ` long blockSize = 32*1024; // 32768 `
long maxBlockSize = 4*1024*1024; const long maxBlockSize = 4*1024*1024;
if (!isMalloced_) { if (!isMalloced_) {
// Minimum size for 1st block // Minimum size for 1st block
@ -1103,7 +1102,9 @@ namespace Exiv2 {
if ( data == NULL ) { if ( data == NULL ) {
throw Error(kerMallocFailed); throw Error(kerMallocFailed);
} }
std::memcpy(data, data_, size_); if (data_ != NULL) {
std::memcpy(data, data_, size_);
}
data_ = data; data_ = data;
sizeAlloced_ = size; sizeAlloced_ = size;
isMalloced_ = true; isMalloced_ = true;
@ -1141,14 +1142,15 @@ namespace Exiv2 {
if (p_->isMalloced_) { if (p_->isMalloced_) {
std::free(p_->data_); std::free(p_->data_);
} }
delete p_;
} }
long MemIo::write(const byte* data, long wcount) long MemIo::write(const byte* data, long wcount)
{ {
p_->reserve(wcount); p_->reserve(wcount);
assert(p_->isMalloced_); assert(p_->isMalloced_);
std::memcpy(&p_->data_[p_->idx_], data, wcount); if (data != NULL) {
std::memcpy(&p_->data_[p_->idx_], data, wcount);
}
p_->idx_ += wcount; p_->idx_ += wcount;
return wcount; return wcount;
} }

@ -2740,7 +2740,6 @@ namespace Exiv2 {
XmpKey::~XmpKey() XmpKey::~XmpKey()
{ {
delete p_;
} }
XmpKey::XmpKey(const XmpKey& rhs) : Key(rhs), p_(new Impl(*rhs.p_)) XmpKey::XmpKey(const XmpKey& rhs) : Key(rhs), p_(new Impl(*rhs.p_))

@ -3168,10 +3168,7 @@ namespace Exiv2 {
{ {
} }
ExifKey::~ExifKey() ExifKey::~ExifKey() {}
{
delete p_;
}
ExifKey& ExifKey::operator=(const ExifKey& rhs) ExifKey& ExifKey::operator=(const ExifKey& rhs)
{ {

@ -380,7 +380,9 @@ namespace Exiv2 {
if (newSize > size_) { if (newSize > size_) {
setData(DataBuf(newSize)); setData(DataBuf(newSize));
} }
memset(pData_, 0x0, size_); if (pData_ != NULL) {
memset(pData_, 0x0, size_);
}
size_ = value->copy(pData_, byteOrder); size_ = value->copy(pData_, byteOrder);
assert(size_ == newSize); assert(size_ == newSize);
setValue(value); setValue(value);

@ -175,7 +175,6 @@ namespace Exiv2 {
Xmpdatum::~Xmpdatum() Xmpdatum::~Xmpdatum()
{ {
delete p_;
} }
std::string Xmpdatum::key() const std::string Xmpdatum::key() const

Loading…
Cancel
Save