]> git.ipfire.org Git - thirdparty/libcgroup.git/commitdiff
tools/cgset: check for delimiter in name_value string
authorKamalesh Babulal <kamalesh.babulal@oracle.com>
Sat, 4 Mar 2023 06:20:53 +0000 (06:20 +0000)
committerTom Hromatka <tom.hromatka@oracle.com>
Mon, 6 Mar 2023 15:23:13 +0000 (08:23 -0700)
While parsing -r option for name, and value pairs, we rely on strtok()
to return NULL, when there is no delimiter and lhf/rhf can't be mapped
into the name, and value tokens. This assumption is not true, strtok()
returns the whole string when it doesn't find the delimiter. Operating
under this assumption also segfaults later in the code.  Fix it, by
checking for the presence of a delimiter in the passed name_value_str
in parse_r_flag().  This also initializes the pointer to NULL, to
avoid reading them before assignment in the error path.

Signed-off-by: Kamalesh Babulal <kamalesh.babulal@oracle.com>
Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>
(cherry picked from commit b29c68bb5d36523e051f7ec0d92b2db93de26bf2)

src/tools/cgset.c

index ae3e2e3339b0fc9aea392afa1ea937ea79db0cac..82f698f8360909b0bd7a7e8afc888e8bb8e9a3f8 100644 (file)
@@ -78,9 +78,16 @@ static void usage(int status, const char *program_name)
 STATIC int parse_r_flag(const char * const program_name, const char * const name_value_str,
                        struct control_value * const name_value)
 {
-       char *copy, *buf;
+       char *copy = NULL, *buf = NULL;
        int ret = 0;
 
+       buf = strchr(name_value_str, '=');
+       if (buf == NULL) {
+               err("%s: wrong parameter of option -r: %s\n", program_name, optarg);
+               ret = EXIT_BADARGS;
+               goto err;
+       }
+
        copy = strdup(name_value_str);
        if (copy == NULL) {
                err("%s: not enough memory\n", program_name);