Merge pull request #285 from D4N/ub_memleak_fixes
Fix some undefined behavior and memory leaks
This commit is contained in:
commit
368771f3fd
@ -526,7 +526,7 @@ namespace Exiv2 {
|
||||
|
||||
// Pimpl idiom
|
||||
class Impl;
|
||||
Impl* p_;
|
||||
std::auto_ptr<Impl> p_;
|
||||
|
||||
}; // class FileIo
|
||||
|
||||
@ -726,7 +726,7 @@ namespace Exiv2 {
|
||||
|
||||
// Pimpl idiom
|
||||
class Impl;
|
||||
Impl* p_;
|
||||
std::auto_ptr<Impl> p_;
|
||||
|
||||
}; // class MemIo
|
||||
|
||||
|
||||
@ -312,7 +312,7 @@ namespace Exiv2 {
|
||||
private:
|
||||
// Pimpl idiom
|
||||
struct Impl;
|
||||
Impl* p_;
|
||||
std::auto_ptr<Impl> p_;
|
||||
|
||||
}; // class XmpKey
|
||||
|
||||
|
||||
@ -222,7 +222,7 @@ namespace Exiv2 {
|
||||
private:
|
||||
// Pimpl idiom
|
||||
struct Impl;
|
||||
Impl* p_;
|
||||
std::auto_ptr<Impl> p_;
|
||||
|
||||
}; // class ExifKey
|
||||
|
||||
|
||||
@ -160,7 +160,7 @@ namespace Exiv2 {
|
||||
private:
|
||||
// Pimpl idiom
|
||||
struct Impl;
|
||||
Impl* p_;
|
||||
std::auto_ptr<Impl> p_;
|
||||
|
||||
}; // class Xmpdatum
|
||||
|
||||
@ -179,6 +179,9 @@ namespace Exiv2 {
|
||||
*/
|
||||
class EXIV2API XmpData {
|
||||
public:
|
||||
//! Default constructor
|
||||
XmpData() : xmpMetadata_(), xmpPacket_(), usePacket_(0) {}
|
||||
|
||||
//! XmpMetadata iterator type
|
||||
typedef XmpMetadata::iterator iterator;
|
||||
//! XmpMetadata const iterator type
|
||||
|
||||
@ -371,7 +371,6 @@ namespace Exiv2 {
|
||||
FileIo::~FileIo()
|
||||
{
|
||||
close();
|
||||
delete p_;
|
||||
}
|
||||
|
||||
int FileIo::munmap()
|
||||
@ -1092,9 +1091,9 @@ namespace Exiv2 {
|
||||
|
||||
void MemIo::Impl::reserve(long wcount)
|
||||
{
|
||||
long need = wcount + idx_;
|
||||
const long need = wcount + idx_;
|
||||
long blockSize = 32*1024; // 32768 `
|
||||
long maxBlockSize = 4*1024*1024;
|
||||
const long maxBlockSize = 4*1024*1024;
|
||||
|
||||
if (!isMalloced_) {
|
||||
// Minimum size for 1st block
|
||||
@ -1103,7 +1102,9 @@ namespace Exiv2 {
|
||||
if ( data == NULL ) {
|
||||
throw Error(kerMallocFailed);
|
||||
}
|
||||
std::memcpy(data, data_, size_);
|
||||
if (data_ != NULL) {
|
||||
std::memcpy(data, data_, size_);
|
||||
}
|
||||
data_ = data;
|
||||
sizeAlloced_ = size;
|
||||
isMalloced_ = true;
|
||||
@ -1141,14 +1142,15 @@ namespace Exiv2 {
|
||||
if (p_->isMalloced_) {
|
||||
std::free(p_->data_);
|
||||
}
|
||||
delete p_;
|
||||
}
|
||||
|
||||
long MemIo::write(const byte* data, long wcount)
|
||||
{
|
||||
p_->reserve(wcount);
|
||||
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;
|
||||
return wcount;
|
||||
}
|
||||
|
||||
@ -2740,7 +2740,6 @@ namespace Exiv2 {
|
||||
|
||||
XmpKey::~XmpKey()
|
||||
{
|
||||
delete p_;
|
||||
}
|
||||
|
||||
XmpKey::XmpKey(const XmpKey& rhs) : Key(rhs), p_(new Impl(*rhs.p_))
|
||||
|
||||
@ -3168,10 +3168,7 @@ namespace Exiv2 {
|
||||
{
|
||||
}
|
||||
|
||||
ExifKey::~ExifKey()
|
||||
{
|
||||
delete p_;
|
||||
}
|
||||
ExifKey::~ExifKey() {}
|
||||
|
||||
ExifKey& ExifKey::operator=(const ExifKey& rhs)
|
||||
{
|
||||
|
||||
@ -380,7 +380,9 @@ namespace Exiv2 {
|
||||
if (newSize > size_) {
|
||||
setData(DataBuf(newSize));
|
||||
}
|
||||
memset(pData_, 0x0, size_);
|
||||
if (pData_ != NULL) {
|
||||
memset(pData_, 0x0, size_);
|
||||
}
|
||||
size_ = value->copy(pData_, byteOrder);
|
||||
assert(size_ == newSize);
|
||||
setValue(value);
|
||||
|
||||
@ -175,7 +175,6 @@ namespace Exiv2 {
|
||||
|
||||
Xmpdatum::~Xmpdatum()
|
||||
{
|
||||
delete p_;
|
||||
}
|
||||
|
||||
std::string Xmpdatum::key() const
|
||||
|
||||
Loading…
Reference in New Issue
Block a user