diff -Naur digikam-0.9.0-beta1.orig/digikam/digikam/imagepreviewjob.cpp digikam-0.9.0-beta1/digikam/digikam/imagepreviewjob.cpp --- digikam-0.9.0-beta1.orig/digikam/digikam/imagepreviewjob.cpp 2006-07-19 23:09:30.000000000 +0200 +++ digikam-0.9.0-beta1/digikam/digikam/imagepreviewjob.cpp 2006-08-19 18:41:19.000000000 +0200 @@ -173,6 +173,12 @@ stream >> width >> height >> depth; preview = QImage(d->shmaddr, width, height, depth, 0, 0, QImage::IgnoreEndian); + + // The buffer supplied to the QImage constructor above must remain valid + // throughout the lifetime of the object. + // This is not true, the shared memory will be freed or reused. + // If we pass the object around, we must do a deep copy. + preview = preview.copy(); } else { diff -Naur digikam-0.9.0-beta1.orig/digikam/digikam/imagepreviewwidget.cpp digikam-0.9.0-beta1/digikam/digikam/imagepreviewwidget.cpp --- digikam-0.9.0-beta1.orig/digikam/digikam/imagepreviewwidget.cpp 2006-07-19 23:09:30.000000000 +0200 +++ digikam-0.9.0-beta1/digikam/digikam/imagepreviewwidget.cpp 2006-08-19 18:41:19.000000000 +0200 @@ -91,11 +91,11 @@ ImagePreviewWidget::~ImagePreviewWidget() { - if (!d->previewJob.isNull()) + if (d->previewJob) d->previewJob->kill(); - + d->blinkPreviewTimer->stop(); - + delete d; } @@ -107,6 +107,9 @@ d->previewBlink = false; d->blinkPreviewTimer->start(200); + if (d->previewJob) + d->previewJob->kill(); + d->previewJob = new ImagePreviewJob(KURL(path), 1024, AlbumSettings::instance()->getExifRotate()); connect(d->previewJob, SIGNAL(signalImagePreview(const KURL&, const QImage&)), @@ -129,9 +132,16 @@ void ImagePreviewWidget::slotGotImagePreview(const KURL&, const QImage& preview) { d->blinkPreviewTimer->stop(); - d->previewJob = 0; d->preview = preview; d->pixmap = QPixmap(contentsRect().size()); + + // It is very important to kill the thumbnail job properly + // so that is frees its shared memory. Otherwise the memory + // will _never_ be freed, see b.k.o. #131277 + if (d->previewJob) + d->previewJob->kill(); + d->previewJob = 0; + updatePixmap(); repaint(false); emit previewComplete(); @@ -140,7 +150,11 @@ void ImagePreviewWidget::slotFailedImagePreview(const KURL&) { d->blinkPreviewTimer->stop(); - d->previewJob = 0; + + if (d->previewJob) + d->previewJob->kill(); + d->previewJob = 0; + d->preview = QImage(); d->pixmap = QPixmap(contentsRect().size()); updatePixmap();