Commit af746914 authored by Peter Wu's avatar Peter Wu
Browse files

Fix memleak of xcb_image_t

Use xcb_image_destroy instead of free, fixes this ASAN report:

    Direct leak of 8294432 byte(s) in 1 object(s) allocated from:
        ...
        #5 0x7f11f9d71938 in xcb_image_get (/usr/lib/libxcb-image.so.0+0x1938)
        #6 0x452612 in X11ImageGrabber::getWindowPixmap(unsigned int, bool) src/PlatformBackends/X11ImageGrabber.cpp:296
        #7 0x45437c in X11ImageGrabber::grabFullScreen() src/PlatformBackends/X11ImageGrabber.cpp:418
        #8 0x432bdd in ImageGrabber::doImageGrab() src/PlatformBackends/ImageGrabber.cpp:90
        ...

REVIEW: 129137
parent 45751d7d
......@@ -217,9 +217,9 @@ QPixmap X11ImageGrabber::convertFromNative(xcb_image_t *xcbImage)
image.setColor(1, QColor(Qt::black).rgb());
}
// done
return QPixmap::fromImage(image);
// Image is ready. Since the backing data from xcbImage could be freed
// before the QPixmap goes away, a deep copy is necessary.
return QPixmap::fromImage(image).copy();
}
// utility functions
......@@ -290,7 +290,7 @@ QPixmap X11ImageGrabber::getWindowPixmap(xcb_window_t window, bool blendPointer)
// then proceed to get an image
CScopedPointer<xcb_image_t> xcbImage(
QScopedPointer<xcb_image_t, ScopedPointerXcbImageDeleter> xcbImage(
xcb_image_get(
xcbConn,
window,
......
......@@ -95,4 +95,11 @@ class X11ImageGrabber : public ImageGrabber
template <typename T> using CScopedPointer = QScopedPointer<T, QScopedPointerPodDeleter>;
struct ScopedPointerXcbImageDeleter
{
static inline void cleanup(xcb_image_t *xcbImage) {
xcb_image_destroy(xcbImage);
}
};
#endif // X11IMAGEGRABBER_H
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment