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
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…
Cancel
Save