From c914d298604ef7ad3934c3c213d3f8822d6646d9 Mon Sep 17 00:00:00 2001 From: Guillaume Buisson <contact@guillaume.dev> Date: ćšć, 20 5æ 2021 13:50:43 +0800 Subject: [PATCH] Several fixes (#120) --- src/library/os/linux/os_linux.cpp | 24 ++++++++++++++---------- 1 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/library/os/linux/os_linux.cpp b/src/library/os/linux/os_linux.cpp index c203e4e..bbf4341 100644 --- a/src/library/os/linux/os_linux.cpp +++ b/src/library/os/linux/os_linux.cpp @@ -12,6 +12,7 @@ #include <sstream> #include "../os.h" #include "../../base/logger.h" +#include "../../base/string_utils.h" #include <mntent.h> #include <dirent.h> @@ -30,6 +31,8 @@ #ifdef USE_DBUS #include <dbus-1.0/dbus/dbus.h> #endif + +using namespace license; /** *Usually uuid are hex number separated by "-". this method read up to 8 hex @@ -97,20 +100,22 @@ FUNCTION_RETURN parse_blkid(const std::string &blkid_file_content, std::vector<DiskInfo> &diskInfos_out, std::unordered_map<std::string, int> &disk_by_uuid) { - DiskInfo diskInfo; + DiskInfo diskInfo = {}; int diskNum = 0; for (std::size_t oldpos = 0, pos = 0; (pos = blkid_file_content.find("</device>", oldpos)) != std::string::npos; oldpos = pos + 1) { std::string cur_dev = blkid_file_content.substr(oldpos, pos); diskInfo.id = diskNum++; std::string device = cur_dev.substr(cur_dev.find_last_of(">") + 1); - strncpy(diskInfo.device, device.c_str(), MAX_PATH); + mstrlcpy(diskInfo.device, device.c_str(), MAX_PATH); std::string label = getAttribute(cur_dev, "PARTLABEL"); - strncpy(diskInfo.label, label.c_str(), 255); + mstrlcpy(diskInfo.label, label.c_str(), 255); std::string disk_sn = getAttribute(cur_dev, "UUID"); parseUUID(disk_sn.c_str(), diskInfo.disk_sn, sizeof(diskInfo.disk_sn)); std::string disk_type = getAttribute(cur_dev, "TYPE"); disk_by_uuid.insert(std::pair<std::string, int>(disk_sn, diskInfo.id)); + diskInfo.label_initialized = true; + diskInfo.sn_initialized = true; // unlikely that somebody put the swap on a removable disk. // this is a first rough guess on what can be a preferred disk for blkid devices // just in case /etc/fstab can't be accessed or it is not up to date. @@ -165,7 +170,7 @@ bool found = false; for (auto &diskInfo : disk_infos) { if (((int)(sym_stat.st_ino)) == diskInfo.id) { - strncpy(diskInfo.label, dir->d_name, 255 - 1); + mstrlcpy(diskInfo.label, dir->d_name, 255); diskInfo.label_initialized = true; LOG_DEBUG("Label for disk ino %d device %s, set to %s", sym_stat.st_ino, diskInfo.device, diskInfo.label); @@ -212,7 +217,7 @@ if (pos != std::string::npos) { device_name_s = device_name_s.substr(pos + 1); } - strncpy(tmpDiskInfo.device, device_name_s.c_str(), sizeof(tmpDiskInfo.device)); + mstrlcpy(tmpDiskInfo.device, device_name_s.c_str(), sizeof(tmpDiskInfo.device)); PARSE_ID_FUNC(dir->d_name, tmpDiskInfo.disk_sn, sizeof(tmpDiskInfo.disk_sn)); tmpDiskInfo.sn_initialized = true; tmpDiskInfo.label_initialized = false; @@ -363,12 +368,11 @@ strcat(proc_path, "/exe"); int ch = readlink(proc_path, path, MAX_PATH - 1); - if (ch != -1) { - path[ch] = '\0'; - strncpy(buffer, path, ch); - result = FUNC_RET_OK; - } else { + if (ch > MAX_PATH || ch < 0) { result = FUNC_RET_ERROR; + } else { + mstrlcpy(buffer, path, ch + 1); + result = FUNC_RET_OK; } return result; } -- Gitblit v1.9.1