163 lines
7.6 KiB
Diff
163 lines
7.6 KiB
Diff
From b134c2c344582f12d3e350168334e50b91a99c7d Mon Sep 17 00:00:00 2001
|
||
From: Stephen Hemminger <stephen@networkplumber.org>
|
||
Date: Mon, 8 May 2023 19:25:33 -0700
|
||
Subject: [PATCH] m_action: fix warning of overwrite of const string
|
||
MIME-Version: 1.0
|
||
Content-Type: text/plain; charset=UTF-8
|
||
Content-Transfer-Encoding: 8bit
|
||
|
||
The function get_action_kind() searches first for the given
|
||
action, then rescans on failure for "gact". In the process,
|
||
it would overwrite the argument. Avoid the warning
|
||
by using a const argument and not copying.
|
||
|
||
The problem dates back to pre-git history.
|
||
|
||
m_action.c: In function ‘get_action_kind’:
|
||
m_action.c:126:17: warning: write to string literal [-Wanalyzer-write-to-string-literal]
|
||
126 | strcpy(str, "gact");
|
||
| ^~~~~~~~~~~~~~~~~~~
|
||
‘do_action’: events 1-6
|
||
|
|
||
| 853 | int do_action(int argc, char **argv)
|
||
| | ^~~~~~~~~
|
||
| | |
|
||
| | (1) entry to ‘do_action’
|
||
|......
|
||
| 858 | while (argc > 0) {
|
||
| | ~~~~~~~~
|
||
| | |
|
||
| | (2) following ‘true’ branch...
|
||
| 859 |
|
||
| 860 | if (matches(*argv, "add") == 0) {
|
||
| | ~~~~~~~~~~~~~~~~~~~~~~
|
||
| | ||
|
||
| | |(3) ...to here
|
||
| | (4) following ‘false’ branch...
|
||
| 861 | ret = tc_action_modify(RTM_NEWACTION,
|
||
| | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||
| | |
|
||
| | (5) ...to here
|
||
| | (6) calling ‘tc_action_modify’ from ‘do_action’
|
||
| 862 | NLM_F_EXCL | NLM_F_CREATE,
|
||
| | ~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||
| 863 | &argc, &argv);
|
||
| | ~~~~~~~~~~~~~
|
||
|
|
||
+--> ‘tc_action_modify’: events 7-8
|
||
|
|
||
| 715 | static int tc_action_modify(int cmd, unsigned int flags,
|
||
| | ^~~~~~~~~~~~~~~~
|
||
| | |
|
||
| | (7) entry to ‘tc_action_modify’
|
||
|......
|
||
| 735 | if (parse_action(&argc, &argv, TCA_ACT_TAB, &req.n)) {
|
||
| | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||
| | |
|
||
| | (8) calling ‘parse_action’ from ‘tc_action_modify’
|
||
|
|
||
+--> ‘parse_action’: events 9-18
|
||
|
|
||
| 203 | int parse_action(int *argc_p, char ***argv_p, int tca_id, struct nlmsghdr *n)
|
||
| | ^~~~~~~~~~~~
|
||
| | |
|
||
| | (9) entry to ‘parse_action’
|
||
|......
|
||
| 217 | if (argc <= 0)
|
||
| | ~
|
||
| | |
|
||
| | (10) following ‘false’ branch...
|
||
|......
|
||
| 220 | tail2 = addattr_nest(n, MAX_MSG, tca_id);
|
||
| | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||
| | |
|
||
| | (11) ...to here
|
||
| 221 |
|
||
| 222 | while (argc > 0) {
|
||
| | ~~~~~~~~
|
||
| | |
|
||
| | (12) following ‘true’ branch...
|
||
| 223 |
|
||
| 224 | memset(k, 0, sizeof(k));
|
||
| | ~~~~~~~~~~~~~~~~~~~~~~~
|
||
| | |
|
||
| | (13) ...to here
|
||
| 225 |
|
||
| 226 | if (strcmp(*argv, "action") == 0) {
|
||
| | ~
|
||
| | |
|
||
| | (14) following ‘true’ branch (when the strings are equal)...
|
||
| 227 | argc--;
|
||
| | ~~~~~~
|
||
| | |
|
||
| | (15) ...to here
|
||
|......
|
||
| 231 | if (!gact_ld)
|
||
| | ~
|
||
| | |
|
||
| | (16) following ‘true’ branch...
|
||
| 232 | get_action_kind("gact");
|
||
| | ~~~~~~~~~~~~~~~~~~~~~~~
|
||
| | |
|
||
| | (17) ...to here
|
||
| | (18) calling ‘get_action_kind’ from ‘parse_action’
|
||
|
|
||
+--> ‘get_action_kind’: events 19-24
|
||
|
|
||
| 86 | static struct action_util *get_action_kind(char *str)
|
||
| | ^~~~~~~~~~~~~~~
|
||
| | |
|
||
| | (19) entry to ‘get_action_kind’
|
||
|......
|
||
| 114 | if (a == NULL)
|
||
| | ~
|
||
| | |
|
||
| | (20) following ‘true’ branch (when ‘a’ is NULL)...
|
||
| 115 | goto noexist;
|
||
| | ~~~~
|
||
| | |
|
||
| | (21) ...to here
|
||
|......
|
||
| 124 | if (!looked4gact) {
|
||
| | ~
|
||
| | |
|
||
| | (22) following ‘true’ branch (when ‘looked4gact == 0’)...
|
||
| 125 | looked4gact = 1;
|
||
| 126 | strcpy(str, "gact");
|
||
| | ~~~~~~~~~~~~~~~~~~~
|
||
| | |
|
||
| | (23) ...to here
|
||
| | (24) write to string literal here
|
||
|
|
||
|
||
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
|
||
---
|
||
tc/m_action.c | 4 ++--
|
||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||
|
||
diff --git a/tc/m_action.c b/tc/m_action.c
|
||
index a446cabd..16474c56 100644
|
||
--- a/tc/m_action.c
|
||
+++ b/tc/m_action.c
|
||
@@ -83,7 +83,7 @@ static int parse_noaopt(struct action_util *au, int *argc_p,
|
||
return -1;
|
||
}
|
||
|
||
-static struct action_util *get_action_kind(char *str)
|
||
+static struct action_util *get_action_kind(const char *str)
|
||
{
|
||
static void *aBODY;
|
||
void *dlh;
|
||
@@ -123,7 +123,7 @@ noexist:
|
||
#ifdef CONFIG_GACT
|
||
if (!looked4gact) {
|
||
looked4gact = 1;
|
||
- strcpy(str, "gact");
|
||
+ str = "gact";
|
||
goto restart_s;
|
||
}
|
||
#endif
|
||
--
|
||
2.27.0
|
||
|