two more toctou bugs

This commit is contained in:
Nico Schlömer
2026-04-27 11:41:09 +02:00
parent 59d09c2c12
commit 5af324f375
2 changed files with 21 additions and 23 deletions
+13 -13
View File
@@ -33,21 +33,21 @@ std::string toLowerCase(const std::string& input) {
std::optional<std::string> getFileBySuffix(const std::string& dir, const std::string& suffix, std::optional<std::string> getFileBySuffix(const std::string& dir, const std::string& suffix,
bool check_lower_case) { bool check_lower_case) {
if (!std::filesystem::exists(dir)) { try {
return {}; for (const auto& entry : std::filesystem::recursive_directory_iterator(dir)) {
} if (entry.is_regular_file()) {
for (const auto& entry : std::filesystem::recursive_directory_iterator(dir)) { std::string filename = entry.path().filename().string();
if (entry.is_regular_file()) { if (filename.size() < suffix.size()) {
std::string filename = entry.path().filename().string(); continue;
if (filename.size() < suffix.size()) { }
continue; if ((filename.compare(filename.size() - suffix.size(), suffix.size(), suffix) == 0) ||
} (check_lower_case && filename.compare(filename.size() - suffix.size(), suffix.size(),
if ((filename.compare(filename.size() - suffix.size(), suffix.size(), suffix) == 0) || toLowerCase(suffix)) == 0)) {
(check_lower_case && filename.compare(filename.size() - suffix.size(), suffix.size(), return entry.path().string();
toLowerCase(suffix)) == 0)) { }
return entry.path().string();
} }
} }
} catch (const std::filesystem::filesystem_error&) {
} }
return {}; return {};
+8 -10
View File
@@ -23,23 +23,21 @@ std::vector<float> waybar::modules::CpuFrequency::parseCpuFrequencies() {
if (frequencies.size() <= 0) { if (frequencies.size() <= 0) {
std::string cpufreq_dir = "/sys/devices/system/cpu/cpufreq"; std::string cpufreq_dir = "/sys/devices/system/cpu/cpufreq";
if (std::filesystem::exists(cpufreq_dir)) { try {
std::vector<std::string> frequency_files = {"/cpuinfo_min_freq", "/cpuinfo_max_freq"}; std::vector<std::string> frequency_files = {"/cpuinfo_min_freq", "/cpuinfo_max_freq"};
for (auto& p : std::filesystem::directory_iterator(cpufreq_dir)) { for (auto& p : std::filesystem::directory_iterator(cpufreq_dir)) {
for (const auto& freq_file : frequency_files) { for (const auto& freq_file : frequency_files) {
std::string freq_file_path = p.path().string() + freq_file; std::string freq_file_path = p.path().string() + freq_file;
if (std::filesystem::exists(freq_file_path)) { std::string freq_value;
std::string freq_value; std::ifstream freq(freq_file_path);
std::ifstream freq(freq_file_path); if (freq.is_open()) {
if (freq.is_open()) { getline(freq, freq_value);
getline(freq, freq_value); float frequency = std::strtol(freq_value.c_str(), nullptr, 10);
float frequency = std::strtol(freq_value.c_str(), nullptr, 10); frequencies.push_back(frequency / 1000);
frequencies.push_back(frequency / 1000);
freq.close();
}
} }
} }
} }
} catch (const std::filesystem::filesystem_error&) {
} }
} }