cfs_gettok() set next->ls_str to NULL if no delimiter is found but
it does not update next->ls_len to 0.
We have to check if next->ls_str is null inside nrs_tbf_id_parse()
to verify if the tbf expression is valid.
* Reproducer *
lctl set_param mds.MDS.mdt.nrs_tbf_rule="start tbf_name gid{500}
rate=100"
This patch fix cfs_gettok() to update "next->ls_len = 0;" if no
delimiter is found.
Signed-off-by: Etienne AUJAMES <eaujames@ddn.com>
Change-Id: Iaa4eb5085262cee547ea3a944ddb94c6df1f8aa3
Reviewed-on: https://review.whamcloud.com/45291
Tested-by: jenkins <devops@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Li Xi <lixi@ddn.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
/* there is no the delimeter in the string */
end = next->ls_str + next->ls_len;
next->ls_str = NULL;
/* there is no the delimeter in the string */
end = next->ls_str + next->ls_len;
next->ls_str = NULL;
} else {
next->ls_str = end + 1;
next->ls_len -= (end - res->ls_str + 1);
} else {
next->ls_str = end + 1;
next->ls_len -= (end - res->ls_str + 1);
/* there is no the delimeter in the string */
end = next->ls_str + next->ls_len;
next->ls_str = NULL;
/* there is no the delimeter in the string */
end = next->ls_str + next->ls_len;
next->ls_str = NULL;
} else {
next->ls_str = end + 1;
next->ls_len -= (end - res->ls_str + 1);
} else {
next->ls_str = end + 1;
next->ls_len -= (end - res->ls_str + 1);
rc = cfs_gettok(src, '=', &res);
if (rc == 0 || res.ls_len != keylen ||
strncmp(res.ls_str, key, keylen) != 0 ||
rc = cfs_gettok(src, '=', &res);
if (rc == 0 || res.ls_len != keylen ||
strncmp(res.ls_str, key, keylen) != 0 ||
- src->ls_len <= 2 || src->ls_str[0] != '{' ||
- src->ls_str[src->ls_len - 1] != '}')
+ !src->ls_str || src->ls_len <= 2 ||
+ src->ls_str[0] != '{' || src->ls_str[src->ls_len - 1] != '}')
return -EINVAL;
/* Skip '{' and '}' */
return -EINVAL;
/* Skip '{' and '}' */
return -ENOMEM;
rc = cfs_gettok(src, NRS_TBF_EXPRESSION_DELIM, &field);
return -ENOMEM;
rc = cfs_gettok(src, NRS_TBF_EXPRESSION_DELIM, &field);
- if (rc == 0 || src->ls_len <= 2 || src->ls_str[0] != '{' ||
- src->ls_str[src->ls_len - 1] != '}')
+ if (rc == 0 || !src->ls_str || src->ls_len <= 2 ||
+ src->ls_str[0] != '{' || src->ls_str[src->ls_len - 1] != '}')
GOTO(out, rc = -EINVAL);
/* Skip '{' and '}' */
GOTO(out, rc = -EINVAL);
/* Skip '{' and '}' */