From 3b57fe6816f2a5837b3879e46b7286bf8d8c162c Mon Sep 17 00:00:00 2001 From: Timothy Pearson Date: Wed, 26 Nov 2014 00:09:45 -0600 Subject: [PATCH] Fix hardware control center crashes on device hot remove Fix incorrect decoding of hex escaped device names --- tdecore/tdehw/tdehardwaredevices.cpp | 11 +++++++++-- tdecore/tdehw/tdestoragedevice.cpp | 20 +++++++++++++++++--- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/tdecore/tdehw/tdehardwaredevices.cpp b/tdecore/tdehw/tdehardwaredevices.cpp index 8905b6000..fd8ee3ba5 100644 --- a/tdecore/tdehw/tdehardwaredevices.cpp +++ b/tdecore/tdehw/tdehardwaredevices.cpp @@ -402,8 +402,8 @@ void TDEHardwareDevices::processHotPluggedHardware() { TDEGenericDevice *hwdevice; for (hwdevice = m_deviceList.first(); hwdevice; hwdevice = m_deviceList.next()) { if (hwdevice->systemPath() == systempath) { - emit hardwareRemoved(hwdevice); - emit hardwareEvent(TDEHardwareEvent::HardwareRemoved, hwdevice->uniqueID()); + // Temporarily disable auto-deletion to ensure object validity when calling the Removed events below + m_deviceList.setAutoDelete(false); // If the device is a storage device and has a slave, update it as well if (hwdevice->type() == TDEGenericDeviceType::Disk) { @@ -423,6 +423,13 @@ void TDEHardwareDevices::processHotPluggedHardware() { m_deviceList.remove(hwdevice); } + emit hardwareRemoved(hwdevice); + emit hardwareEvent(TDEHardwareEvent::HardwareRemoved, hwdevice->uniqueID()); + + // Reenable auto-deletion and delete the removed device object + m_deviceList.setAutoDelete(true); + delete hwdevice; + break; } } diff --git a/tdecore/tdehw/tdestoragedevice.cpp b/tdecore/tdehw/tdestoragedevice.cpp index 9491a6675..70258e436 100644 --- a/tdecore/tdehw/tdestoragedevice.cpp +++ b/tdecore/tdehw/tdestoragedevice.cpp @@ -25,6 +25,7 @@ #include #include +#include #include #include @@ -489,13 +490,26 @@ void TDEStorageDevice::internalSetSlaveDevices(TQStringList sd) { m_slaveDevices = sd; } +TQString decodeHexEncoding(TQString str) { + TQRegExp hexEncRegExp("\\\\x[0-9A-Fa-f]{1,2}"); + hexEncRegExp.setMinimal(false); + hexEncRegExp.setCaseSensitive(true); + int s = -1; + + while((s = hexEncRegExp.search(str, s+1))>=0){ + str.replace(s, hexEncRegExp.cap(0).length(), TQChar((char)strtol(hexEncRegExp.cap(0).mid(2).ascii(), NULL, 16))); + } + + return str; +} + TQString TDEStorageDevice::friendlyName() { // Return the actual storage device name TQString devicevendorid = vendorEncoded(); TQString devicemodelid = modelEncoded(); - devicevendorid.replace("\\x20", " "); - devicemodelid.replace("\\x20", " "); + devicevendorid = decodeHexEncoding(devicevendorid); + devicemodelid = decodeHexEncoding(devicemodelid); devicevendorid = devicevendorid.stripWhiteSpace(); devicemodelid = devicemodelid.stripWhiteSpace(); @@ -637,7 +651,7 @@ TQPixmap TDEStorageDevice::icon(TDEIcon::StdSizes size) { ret = DesktopIcon("tape_unmount", size); } if (isDiskOfType(TDEDiskDeviceType::Camera)) { - ret = DesktopIcon("camera_unmount"); + ret = DesktopIcon("camera_unmount", size); } if (isDiskOfType(TDEDiskDeviceType::HDD)) {