~ScopedDevices() { if (devices) { for (struct Device **iter = devices; *iter; ++iter) { mb_device_free(*iter); } free(devices); } }
void MainWindow::populateDevices() { Q_D(MainWindow); // TODO: This shouldn't be done in the GUI thread QString path(QString::fromStdString(d->pc->dataDirectory()) % QStringLiteral("/devices.json")); QFile file(path); if (file.open(QIODevice::ReadOnly)) { QByteArray contents = file.readAll(); file.close(); MbDeviceJsonError error; Device **devices = mb_device_new_list_from_json(contents.data(), &error); if (devices) { for (Device **iter = devices; *iter; ++iter) { if (mb_device_validate(*iter) == 0) { d->deviceSel->addItem(QStringLiteral("%1 - %2") .arg(QString::fromUtf8(mb_device_id(*iter))) .arg(QString::fromUtf8(mb_device_name(*iter)))); d->devices.emplace_back(*iter, mb_device_free); } else { // Clean up unusable devices mb_device_free(*iter); } } // No need for array anymore free(devices); } else { qWarning("Failed to load devices"); } } else { qWarning("%s: Failed to open file: %s", path.toUtf8().data(), file.errorString().toUtf8().data()); } }
static bool find_paths(struct paths *paths) { std::unordered_map<std::string, std::string> props; util::file_get_all_properties(DEFAULT_PROP_PATH, &props); std::string userdata; std::string header; std::string recovery; std::vector<unsigned char> contents; util::file_read_all(DEVICE_JSON_PATH, &contents); contents.push_back('\0'); MbDeviceJsonError error; Device *device = mb_device_new_from_json((char *) contents.data(), &error); if (!device) { LOGE("%s: Failed to load device definition", DEVICE_JSON_PATH); return false; } else if (mb_device_validate(device) != 0) { LOGE("%s: Device definition validation failed", DEVICE_JSON_PATH); mb_device_free(device); return false; } auto userdata_list = mb_device_data_block_devs(device); auto recovery_list = mb_device_recovery_block_devs(device); if (userdata_list) { for (auto it = userdata_list; *it; ++it) { if (access(*it, R_OK) == 0) { userdata = *it; break; } } } if (recovery_list) { for (auto it = recovery_list; *it; ++it) { if (access(*it, R_OK) == 0) { recovery = *it; break; } } } mb_device_free(device); header = props[PROP_CRYPTFS_HEADER_PATH]; if (userdata.empty()) { LOGE("Encrypted partition path could not be detected"); return false; } if (recovery.empty()) { LOGE("Recovery partition path could not be detected"); return false; } if (header.empty()) { LOGE("Cryptfs header path could not be detected"); return false; } paths->userdata.swap(userdata); paths->recovery.swap(recovery); paths->header.swap(header); return true; }
~ScopedDevice() { mb_device_free(device); }