From 33bd1e08d0043e9b1340898039562bdf595879b5 Mon Sep 17 00:00:00 2001 From: Laszlo Papp Date: Mon, 17 Mar 2014 21:07:55 +0000 Subject: Use QScopedPointer (RAII) for avoiding the memory leak for udev Task-number: QTBUG-37578 Change-Id: I9e9146a1f7339a88c63cb320a47f63f069a6120e Reviewed-by: Sergey Belyashov --- src/serialport/qserialportinfo_unix.cpp | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/src/serialport/qserialportinfo_unix.cpp b/src/serialport/qserialportinfo_unix.cpp index 5a77abcc..5ec2c124 100644 --- a/src/serialport/qserialportinfo_unix.cpp +++ b/src/serialport/qserialportinfo_unix.cpp @@ -48,6 +48,7 @@ #include #include #include +#include #ifndef Q_OS_MAC @@ -197,6 +198,14 @@ QList availablePortsBySysfs() return serialPortInfoList; } +struct ScopedPointerUdevDeleter +{ + static inline void cleanup(struct ::udev_device *pointer) + { + ::udev_device_unref(pointer); + } +}; + #ifndef LINK_LIBUDEV Q_GLOBAL_STATIC(QLibrary, udevLibrary) #endif @@ -229,18 +238,17 @@ QList availablePortsByUdev() struct ::udev_list_entry *dev_list_entry; udev_list_entry_foreach(dev_list_entry, devices) { - struct ::udev_device *dev = - ::udev_device_new_from_syspath(udev, - ::udev_list_entry_get_name(dev_list_entry)); + QScopedPointer dev(::udev_device_new_from_syspath(udev, + ::udev_list_entry_get_name(dev_list_entry))); if (dev) { QSerialPortInfo serialPortInfo; - serialPortInfo.d_ptr->device = QString::fromLatin1(::udev_device_get_devnode(dev)); - serialPortInfo.d_ptr->portName = QString::fromLatin1(::udev_device_get_sysname(dev)); + serialPortInfo.d_ptr->device = QString::fromLatin1(::udev_device_get_devnode(dev.data())); + serialPortInfo.d_ptr->portName = QString::fromLatin1(::udev_device_get_sysname(dev.data())); - struct ::udev_device *parentdev = ::udev_device_get_parent(dev); + struct ::udev_device *parentdev = ::udev_device_get_parent(dev.data()); if (parentdev) { @@ -248,20 +256,20 @@ QList availablePortsByUdev() if (subsys == QStringLiteral("usb-serial") || subsys == QStringLiteral("usb")) { - serialPortInfo.d_ptr->description = QString::fromLatin1(::udev_device_get_property_value(dev, + serialPortInfo.d_ptr->description = QString::fromLatin1(::udev_device_get_property_value(dev.data(), "ID_MODEL")).replace(QLatin1Char('_'), QLatin1Char(' ')); - serialPortInfo.d_ptr->manufacturer = QString::fromLatin1(::udev_device_get_property_value(dev, + serialPortInfo.d_ptr->manufacturer = QString::fromLatin1(::udev_device_get_property_value(dev.data(), "ID_VENDOR")).replace(QLatin1Char('_'), QLatin1Char(' ')); serialPortInfo.d_ptr->serialNumber = QString( - QLatin1String(::udev_device_get_property_value(dev, "ID_SERIAL_SHORT"))); + QLatin1String(::udev_device_get_property_value(dev.data(), "ID_SERIAL_SHORT"))); serialPortInfo.d_ptr->vendorIdentifier = - QString::fromLatin1(::udev_device_get_property_value(dev, + QString::fromLatin1(::udev_device_get_property_value(dev.data(), "ID_VENDOR_ID")).toInt(&serialPortInfo.d_ptr->hasVendorIdentifier, 16); serialPortInfo.d_ptr->productIdentifier = - QString::fromLatin1(::udev_device_get_property_value(dev, + QString::fromLatin1(::udev_device_get_property_value(dev.data(), "ID_MODEL_ID")).toInt(&serialPortInfo.d_ptr->hasProductIdentifier, 16); } else if (subsys == QStringLiteral("pnp")) { @@ -286,8 +294,6 @@ QList availablePortsByUdev() } serialPortInfoList.append(serialPortInfo); - - ::udev_device_unref(dev); } } -- cgit v1.2.3