diff options
author | Denis Shienkov <denis.shienkov@gmail.com> | 2015-06-26 11:30:19 +0300 |
---|---|---|
committer | Denis Shienkov <denis.shienkov@gmail.com> | 2015-06-29 15:08:17 +0000 |
commit | e63f2f213ae1ab79b051ccf355c58ed6a305de55 (patch) | |
tree | 9fbe70eb09e0737f192fc9270f42548ba4a971ff | |
parent | dbccb6181293730bc76c2f3b2590e584ef876f6d (diff) | |
download | qtserialport-e63f2f213ae1ab79b051ccf355c58ed6a305de55.tar.gz |
Fix crash in QSPI::availablePorts() on OS X 10.10
CFTypeRef returned by IORegistryEntrySearchCFProperty sometimes may be
of unexpected type (as CFStringRef instead of CFNumberRef). In this case
the CFNumberGetValue() throws the exception.
The simplest fix is to check the type in searchShortIntProperty() before
calling CFNumberGetValue():
CFGetTypeID(result.as<CFNumberRef>()) == CFNumberGetTypeID().
Thanks to Orest Hera.
(cherry-picked from a7a4fa4b628526a5d9138ed56bb195be71bac118)
Task-number: QTBUG-46875
Change-Id: Id86993c008595f9762a08739bf4c5f5662643e92
Reviewed-by: Denis Shienkov <denis.shienkov@gmail.com>
-rw-r--r-- | src/serialport/qserialportinfo_mac.cpp | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/src/serialport/qserialportinfo_mac.cpp b/src/serialport/qserialportinfo_mac.cpp index b20264b..3f242f1 100644 --- a/src/serialport/qserialportinfo_mac.cpp +++ b/src/serialport/qserialportinfo_mac.cpp @@ -80,9 +80,10 @@ static quint16 searchShortIntProperty(io_registry_entry_t ioRegistryEntry, bool &ok) { const QCFType<CFTypeRef> result(searchProperty(ioRegistryEntry, propertyKey)); + const CFNumberRef ref = result.as<CFNumberRef>(); quint16 value = 0; - ok = result.as<CFNumberRef>() - && (::CFNumberGetValue(result.as<CFNumberRef>(), kCFNumberShortType, &value) > 0); + ok = ref && (::CFGetTypeID(ref) == ::CFNumberGetTypeID()) + && (::CFNumberGetValue(ref, kCFNumberShortType, &value) > 0); return value; } |