https://bugs.kde.org/show_bug.cgi?id=462308

            Bug ID: 462308
           Summary: MediaProxy::determineBackgroundType needlessly
                    instantiates all available QImage reader plugins
    Classification: Plasma
           Product: plasmashell
           Version: master
          Platform: Other
               URL: https://bugzilla.redhat.com/show_bug.cgi?id=2144200#c2
                    2
                OS: Linux
            Status: REPORTED
          Severity: normal
          Priority: NOR
         Component: Image Wallpaper
          Assignee: plasma-b...@kde.org
          Reporter: kevin.kof...@chello.at
                CC: notm...@gmail.com, qydwhotm...@gmail.com
  Target Milestone: 1.0

SUMMARY
In order to determine whether the wallpaper is animated or not,
MediaProxy::determineBackgroundType uses the following algorithm:
if
(QMovie::supportedFormats().contains(QFileInfo(filePath).suffix().toLower().toLatin1()))
{
This enumerates all image types that support animations, then checks whether
the one we care about is contained in the list.

Unfortunately, to check which image types support animations,
QMovie::supportedFormats() needs to instantiate each and every image reader
plugin that is available and ask it whether it supports animations.

STEPS TO REPRODUCE
We have caught this in Fedora by accident, because we ran into a bug:
https://bugzilla.redhat.com/show_bug.cgi?id=2144200
where Chromium and PDFium would fail to load on Apple hardware using "Apple
Silicon" ARM CPUs. This surprisingly lead to the whole Plasma shell failing to
start because the QImage PDF reader would crash during initialization, crashing
the entire shell along with it. Since image reader plugins can generally be of
varying quality, it would be much safer to avoid instantiating less tested
exotic plugins when we do not actually need them.

OBSERVED RESULT
A crash in PDFium can crash the entire Plasma Shell, turning QtPdf into a
critical package.

EXPECTED RESULT
The Plasma Shell should not load PDFium unless the wallpaper is actually a PDF.
And likewise for other rarely used image decoding plugins.

SOFTWARE/OS VERSIONS
All current Plasma versions, on all hardware. The crash can be reproduced by
using an unfixed QtWebEngine/QtPdf on Apple Silicon hardware, but the
underlying issue exists everywhere.

ADDITIONAL INFORMATION
Instead of enumerating all image formats that support animation using
QMovie::supportedFormats():

    if
(QMovie::supportedFormats().contains(QFileInfo(filePath).suffix().toLower().toLatin1()))
{

the better way would be to do what QMovie::supportedFormats() does internally,
but only on the type we actually care about, without enumerating them:

    QBuffer dummyBuffer;
    dummyBuffer.open(QIODevice::ReadOnly);

    if (QImageReader(&dummyBuffer,
QFileInfo(filePath).suffix().toLower().toLatin1()).supportsOption(QImageIOHandler::Animation))
{

See also the downstream bug report:
https://bugzilla.redhat.com/show_bug.cgi?id=2144200#c22

-- 
You are receiving this mail because:
You are watching all bug changes.

Reply via email to