gcontini
2020-11-28 8ad56e8eda4a63e9a81c275e4eb26e9239237ad4
replace strncpy with a more safe alternative
5个文件已修改
43 ■■■■ 已修改文件
src/library/base/string_utils.cpp 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/library/base/string_utils.h 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/library/licensecc.cpp 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/library/os/linux/network.cpp 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/library/os/linux/os_linux.cpp 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/library/base/string_utils.cpp
@@ -107,4 +107,17 @@
    return count;
}
size_t mstrlcpy(char *dst, const char *src, size_t n) {
    size_t n_orig = n;
    if (n > 0) {
        char *pd;
        const char *ps;
        for (--n, pd = dst, ps = src; n > 0 && *ps != '\0'; --n, ++pd, ++ps) *pd = *ps;
        *pd = '\0';
    }
    return n_orig - n;
}
} /* namespace license */
src/library/base/string_utils.h
@@ -33,6 +33,9 @@
// strnln_s is not well supported and strlen is marked unsafe..
size_t mstrnlen_s(const char* szptr, size_t maxsize);
// strlcpy is not a standard function but it's the safest way to copy to c strings...
// let's provide a custom implementation
size_t mstrlcpy(char* dst, const char* src, size_t n);
typedef enum {
    INI, BASE64, UNKNOWN
} FILE_FORMAT;
src/library/licensecc.cpp
@@ -18,6 +18,7 @@
#include <licensecc_properties.h>
#include "base/logger.h"
#include "base/string_utils.h"
#include "hw_identifier/hw_identifier_facade.hpp"
#include "os/execution_environment.hpp"
#include "limits/license_verifier.hpp"
@@ -34,7 +35,7 @@
    if (*bufSize > LCC_API_PC_IDENTIFIER_SIZE && chbuffer != nullptr) {
        try {
            const string pc_id = license::hw_identifier::HwIdentifierFacade::generate_user_pc_signature(pc_id_method);
            strncpy(chbuffer, pc_id.c_str(), *bufSize);
            license::mstrlcpy(chbuffer, pc_id.c_str(), *bufSize);
            result = true;
        } catch (const std::exception& ex) {
            LOG_ERROR("Error calculating hw_identifier: %s", ex.what());
@@ -45,8 +46,8 @@
    } else {
        *bufSize = LCC_API_PC_IDENTIFIER_SIZE + 1;
    }
    static const license::os::ExecutionEnvironment exec_env;
    if (execution_environment_info != nullptr) {
        const license::os::ExecutionEnvironment exec_env;
        execution_environment_info->cloud_provider = exec_env.cloud_provider();
        execution_environment_info->virtualization = exec_env.virtualization();
        execution_environment_info->virtualization_detail = exec_env.virtualization_detail();
src/library/os/linux/network.cpp
@@ -67,7 +67,7 @@
        if (adapterByName.find(if_name) == adapterByName.end()) {
            OsAdapterInfo newAdapter;
            memset(&newAdapter, 0, sizeof(OsAdapterInfo));
            strncpy(&newAdapter.description[0], ifa->ifa_name, LCC_ADAPTER_DESCRIPTION_LEN);
            mstrlcpy(&newAdapter.description[0], ifa->ifa_name, LCC_ADAPTER_DESCRIPTION_LEN);
            adapterByName[if_name] = newAdapter;
        }
        auto it = adapterByName.find(if_name);
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
@@ -104,9 +107,9 @@
        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");
@@ -167,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);
@@ -214,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;
@@ -365,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;
}