From 06433652bead1e902539d01712591a0aca5eb392 Mon Sep 17 00:00:00 2001 From: comex Date: Tue, 21 Oct 2014 03:11:58 -0400 Subject: [PATCH] Improve some libcdio CoreFoundation code. I found it via clang complaining about a useless null check on an array, but I decided to get rid of the array in favor of dynamic allocation, as there was no reason to assume a maximum length of 0x32 bytes. Plus, add a CFString type check just in case, and switch to UTF-8 in the off-chance it matters. The result has not actually been tested, as I have no CD drive. --- Source/Core/Common/CDUtils.cpp | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/Source/Core/Common/CDUtils.cpp b/Source/Core/Common/CDUtils.cpp index 45f2011149..50c1902eac 100644 --- a/Source/Core/Common/CDUtils.cpp +++ b/Source/Core/Common/CDUtils.cpp @@ -91,8 +91,6 @@ std::vector cdio_get_devices() next_media = IOIteratorNext( media_iterator ); if (next_media != 0) { - char psz_buf[0x32]; - size_t dev_path_length; CFTypeRef str_bsd_path; do @@ -107,22 +105,20 @@ std::vector cdio_get_devices() continue; } - // Below, by appending 'r' to the BSD node name, we indicate - // a raw disk. Raw disks receive I/O requests directly and - // don't go through a buffer cache. - snprintf( psz_buf, sizeof(psz_buf), "%s%c", _PATH_DEV, 'r' ); - dev_path_length = strlen( psz_buf ); - - if (CFStringGetCString( (CFStringRef)str_bsd_path, - (char*)&psz_buf + dev_path_length, - sizeof(psz_buf) - dev_path_length, - kCFStringEncodingASCII)) + if (CFGetTypeID(str_bsd_path) == CFStringGetTypeID()) { - if (psz_buf != nullptr) + size_t buf_size = CFStringGetLength((CFStringRef)str_bsd_path) * 4 + 1; + char* buf = new char[buf_size]; + + if (CFStringGetCString((CFStringRef)str_bsd_path, buf, buf_size, kCFStringEncodingUTF8)) { - std::string str = psz_buf; - drives.push_back(str); + // Below, by appending 'r' to the BSD node name, we indicate + // a raw disk. Raw disks receive I/O requests directly and + // don't go through a buffer cache. + drives.push_back(std::string(_PATH_DEV "r") + buf); } + + delete[] buf; } CFRelease( str_bsd_path ); IOObjectRelease( next_media );