diff --git a/src/external/rawspeed/RawSpeed/RawImage.cpp b/src/external/rawspeed/RawSpeed/RawImage.cpp index 4c63e57cb381..31867c2600e9 100644 --- a/src/external/rawspeed/RawSpeed/RawImage.cpp +++ b/src/external/rawspeed/RawSpeed/RawImage.cpp @@ -394,11 +394,18 @@ RawImage& RawImage::operator=(const RawImage & p) { if (this == &p) // Same object? return *this; // Yes, so skip assignment, and just return *this. pthread_mutex_lock(&p_->mymutex); + // Retain the old RawImageData before overwriting it RawImageData* const old = p_; p_ = p.p_; + // Increment use on new data ++p_->dataRefCount; - if (--old->dataRefCount == 0) delete old; - pthread_mutex_unlock(&p_->mymutex); + // If the RawImageData previously used by "this" is unused, delete it. + if (--old->dataRefCount == 0) { + pthread_mutex_unlock(&(old->mymutex)); + delete old; + } else { + pthread_mutex_unlock(&(old->mymutex)); + } return *this; }