From b53f4a5c5bd825790ccf1f1c98761f388683fa77 Mon Sep 17 00:00:00 2001 From: JofDiamonds Date: Wed, 15 Feb 2023 17:07:47 +0800 Subject: [PATCH] clean code and use securec function (cherry picked from commit c30c34ee5f7209cfdc68eada5f5683490e36f088) --- ...-clean-code-and-use-securec-function.patch | 202 ++++++++++++++++++ oncn-bwm-1.0.tar.gz | Bin 21163 -> 0 bytes oncn-bwm-1.1.tar.gz | Bin 0 -> 21097 bytes oncn-bwm.spec | 13 +- 4 files changed, 212 insertions(+), 3 deletions(-) create mode 100644 0002-clean-code-and-use-securec-function.patch delete mode 100644 oncn-bwm-1.0.tar.gz create mode 100644 oncn-bwm-1.1.tar.gz diff --git a/0002-clean-code-and-use-securec-function.patch b/0002-clean-code-and-use-securec-function.patch new file mode 100644 index 0000000..11c59fe --- /dev/null +++ b/0002-clean-code-and-use-securec-function.patch @@ -0,0 +1,202 @@ +From ce6a3a3afb89842d29c4c7e8a18dfbc1e46f4e55 Mon Sep 17 00:00:00 2001 +From: JofDiamonds +Date: Wed, 15 Feb 2023 16:29:48 +0800 +Subject: [PATCH] clean code and use securec function + +--- + CMakeLists.txt | 2 +- + bpf/bwm_tc.c | 5 ++--- + bwmcli.c | 42 ++++++++++++++++++++++-------------------- + 3 files changed, 25 insertions(+), 24 deletions(-) + +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 70b47e7..c711a1c 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -14,4 +14,4 @@ if($ENV{HS_COVERAGE_ENABLE}) + endif($ENV{HS_COVERAGE_ENABLE}) + + add_executable(bwmcli bwmcli.c) +-target_link_libraries(bwmcli -l:libbpf.so) ++target_link_libraries(bwmcli -l:libbpf.so -l:libboundscheck.so) +diff --git a/bpf/bwm_tc.c b/bpf/bwm_tc.c +index 3585c6d..286783a 100644 +--- a/bpf/bwm_tc.c ++++ b/bpf/bwm_tc.c +@@ -53,8 +53,7 @@ struct bpf_elf_map_t SEC("maps") throttle_map = { + .id = 0, + }; + +-static void throttle_init(const struct edt_throttle_cfg *cfg, +- struct edt_throttle *throttle) ++static void throttle_init(const struct edt_throttle_cfg *cfg, struct edt_throttle *throttle) + { + throttle->t_last = 0; + throttle->rate = cfg->low_rate; +@@ -154,7 +153,7 @@ int bwm_tc(struct __sk_buff *skb) + if (throttle->rate == 0) + throttle_init(cfg_con, throttle); + +- priority_index = bpf_skb_cgroup_classid(skb); ++ priority_index = (unsigned int)bpf_skb_cgroup_classid(skb); + skb->priority += priority_index; + + const struct __sk_buff *skb_con = skb; +diff --git a/bwmcli.c b/bwmcli.c +index 75fbfab..b56a8b9 100644 +--- a/bwmcli.c ++++ b/bwmcli.c +@@ -20,6 +20,7 @@ + #include + + #include "bwm_tc.h" ++#include "securec.h" + #include "bwmcli.h" + + #include +@@ -159,14 +160,14 @@ static int BwmOption(const char *str) + return -1; + } + +-static void Usage(char *argv[]) ++static void Usage(char *const argv[]) + { + int i; + + BWM_LOG_INFO("Usage: %s \n", argv[0]); + BWM_LOG_INFO(" Options are:\n"); + for (i = 0; g_helps[i].name != NULL; i++) { +- BWM_LOG_INFO(" -%c --%-18s", g_longOptions[i].val, g_longOptions[i].name); ++ BWM_LOG_INFO(" -%c --%-18s", (char)(g_longOptions[i].val), g_longOptions[i].name); + if (strlen(g_longOptions[i].name) > 25) { // 25 means line length + BWM_LOG_INFO("\n\t\t\t%s\n", g_helps[i].name); + } else { +@@ -316,7 +317,7 @@ static bool CheckCgrpV1PathLegal(const char *cgrpPath, char *trustedPath) + return false; + } + +- int ret = snprintf(trustedPath, PATH_MAX + 1, "%s/%s", trustedCgrpPath, "net_cls.classid"); ++ int ret = snprintf_s(trustedPath, PATH_MAX + 1, PATH_MAX + 1, "%s/%s", trustedCgrpPath, "net_cls.classid"); + if (ret < 0 || stat(trustedPath, &st) < 0 || (st.st_mode & S_IFMT) != S_IFREG) { + BWM_LOG_ERR("CgrpV1Prio get realPath failed. ret: %d\n", ret); + return false; +@@ -349,9 +350,9 @@ static int CgrpV1Prio(const char *cgrpPath, int prio, int op) + + switch (op) { + case PRIO_SET: +- ret = snprintf(buf, BUF_SIZE, "%u\n", (__u32)prio); ++ ret = snprintf_s(buf, BUF_SIZE, BUF_SIZE, "%u\n", (__u32)prio); + if (ret < 0) { +- BWM_LOG_ERR("CgrpV1Prio snprintf prio failed. ret: %d.\n", ret); ++ BWM_LOG_ERR("CgrpV1Prio snprintf_s prio failed. ret: %d.\n", ret); + (void)close(fd); + return -1; + } +@@ -499,7 +500,7 @@ end: + static int NetdevEnabledSub(const char *format, const char *ethdev) + { + int ret; +- ret = snprintf(g_cmdBuf, MAX_CMD_LEN, format, ethdev); ++ ret = snprintf_s(g_cmdBuf, MAX_CMD_LEN, MAX_CMD_LEN, format, ethdev); + if (ret < 0) { + return 0; + } +@@ -545,7 +546,7 @@ static int DisableSpecificNetdevice(const char *ethdev, const void *unused) + } + + for (i = 0; i < sizeof(g_disableSeq) / sizeof(struct TcCmd); i++) { +- ret = snprintf(g_cmdBuf, MAX_CMD_LEN, g_disableSeq[i].cmdStr, ethdev); ++ ret = snprintf_s(g_cmdBuf, MAX_CMD_LEN, MAX_CMD_LEN, g_disableSeq[i].cmdStr, ethdev); + if (ret < 0 || g_cmdBuf[MAX_CMD_LEN - 1] != '\0') { + BWM_LOG_ERR("Invalid net device: %s\n", ethdev); + return EXIT_FAIL_OPTION; +@@ -572,7 +573,7 @@ static bool execute_cmd(const char *format, const char *ethdev, const char *sear + { + int ret; + +- ret = snprintf(g_cmdBuf, MAX_CMD_LEN, format, ethdev, search); ++ ret = snprintf_s(g_cmdBuf, MAX_CMD_LEN, MAX_CMD_LEN, format, ethdev, search); + if (ret < 0 || g_cmdBuf[MAX_CMD_LEN - 1] != '\0') { + g_cmdBuf[MAX_CMD_LEN - 1] = '\0'; + BWM_LOG_ERR("Invalid cmd: %s\n", g_cmdBuf); +@@ -650,7 +651,7 @@ static int EnableSpecificNetdevice(const char *ethdev, const void *unused) + } + + for (i = 0; i < sizeof(g_enableSeq) / sizeof(struct TcCmd); i++) { +- ret = snprintf(g_cmdBuf, MAX_CMD_LEN, g_enableSeq[i].cmdStr, ethdev); ++ ret = snprintf_s(g_cmdBuf, MAX_CMD_LEN, MAX_CMD_LEN, g_enableSeq[i].cmdStr, ethdev); + if (ret < 0 || g_cmdBuf[MAX_CMD_LEN - 1] != '\0') { + BWM_LOG_ERR("Invalid net device: %s\n", ethdev); + return EXIT_FAIL_OPTION; +@@ -684,8 +685,7 @@ clear: + // return: true is legal, false is illegal + static bool CheckDevNameIsLegalChar(const char c) + { +- if ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || c == '-' +- || c == '_') { ++ if ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || c == '-' || c == '_') { + return true; + } + return false; +@@ -911,14 +911,15 @@ static int ParseArgs(char *args, long long *val1, long long *val2, int mutilArgs + return EXIT_OK; + } + +-static int CfgsInfo(int argc, char **argv, int isSet) ++static int CfgsInfo(int argc, char *const *argv, int isSet) + { + int ret; ++ errno_t rc; + char option[PATH_MAX + 1] = {0}; + char args[PRIO_LEN] = {0}; + +- (void)strncpy(option, optarg, PATH_MAX); +- if (option[PATH_MAX] != '\0') { ++ rc = strncpy_s(option, PATH_MAX + 1, optarg, PATH_MAX + 1); ++ if (rc != EOK || option[PATH_MAX] != '\0') { + (void)fprintf(stderr, "invalid option, too long: %s\n", optarg); + return EXIT_FAIL_OPTION; + } +@@ -932,8 +933,8 @@ static int CfgsInfo(int argc, char **argv, int isSet) + return ret; + } + +- (void)strncpy(args, argv[optind], PRIO_LEN - 1); +- if (args[PRIO_LEN - 1] != '\0') { ++ rc = strncpy_s(args, PRIO_LEN, argv[optind], strlen(argv[optind])); ++ if (rc != EOK || args[PRIO_LEN - 1] != '\0') { + (void)fprintf(stderr, "invalid args, too long: %s\n", argv[optind]); + return EXIT_FAIL_OPTION; + } +@@ -959,9 +960,10 @@ inline static int IsValidEthdev(const char *dev) + return ForeachEthdev(NetdevCmp, dev); + } + +-static int ChangeNetdeviceStatus(int argc, char **argv, int enable) ++static int ChangeNetdeviceStatus(int argc, char *const *argv, int enable) + { + int ret; ++ errno_t rc; + char ethdev[NAME_MAX + 1] = {0}; + + if (optarg == NULL && (optind >= argc || argv[optind][0] == '-')) { +@@ -971,13 +973,13 @@ static int ChangeNetdeviceStatus(int argc, char **argv, int enable) + } + + if (optarg != NULL) { +- (void)strncpy(ethdev, optarg, NAME_MAX); ++ rc = strncpy_s(ethdev, NAME_MAX + 1, optarg, NAME_MAX + 1); + } else { +- (void)strncpy(ethdev, argv[optind], NAME_MAX); ++ rc = strncpy_s(ethdev, NAME_MAX + 1, argv[optind], NAME_MAX + 1); + optind++; + } + +- if (ethdev[NAME_MAX] != '\0') { ++ if (rc != EOK || ethdev[NAME_MAX] != '\0') { + (void)fprintf(stderr, "invalid dev name: %s\n", optarg); + return EXIT_FAIL_OPTION; + } +-- +2.33.0 + diff --git a/oncn-bwm-1.0.tar.gz b/oncn-bwm-1.0.tar.gz deleted file mode 100644 index bdf2fcd64519fe66768e57f428d1fe6c165eba81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21163 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 Ak^lez literal 0 HcmV?d00001 diff --git a/oncn-bwm.spec b/oncn-bwm.spec index 7bc17d1..a1367f4 100644 --- a/oncn-bwm.spec +++ b/oncn-bwm.spec @@ -1,16 +1,20 @@ Name: oncn-bwm -Version: 1.0 -Release: 5 +Version: 1.1 +Release: 1 Summary: Pod bandwidth management in mixed deployment scenarios of online and offline services License: GPL-2.0 URL: https://gitee.com/src-openeuler/oncn-bwm Source: %{name}-%{version}.tar.gz -BuildRequires: libbpf-devel cmake gcc clang +BuildRequires: libbpf-devel cmake gcc clang +BuildRequires: libboundscheck + Requires: iproute libbpf Requires(preun): bpftool +Requires: libboundscheck Patch9001: 0001-adapt-libbpf-0.8.1.patch +Patch9002: 0002-clean-code-and-use-securec-function.patch %description Pod bandwidth management in mixed deployment scenarios of online and offline services @@ -89,6 +93,9 @@ fi %changelog +* Wed Feb 15 2023 JofDiamonds - 1.1-1 +- clean code and use securec function + * Thu Jan 5 2023 JofDiamonds - 1.0-5 - update oncn-bwm.yaml -- Gitee