if (rule == NULL)
return -ENOMEM;
- memcpy(rule->tr_name, start->tc_name, strlen(start->tc_name));
+ strlcpy(rule->tr_name, start->tc_name, sizeof(rule->tr_name));
rule->tr_rpc_rate = start->u.tc_start.ts_rpc_rate;
rule->tr_flags = start->u.tc_start.ts_rule_flags;
rule->tr_nsecs_per_rpc = NSEC_PER_SEC / rule->tr_rpc_rate;
}
}
-static bool name_is_valid(const char *name)
+static int check_rule_name(const char *name)
{
int i;
- for (i = 0; i < strlen(name); i++) {
- if ((!isalnum(name[i])) &&
- (name[i] != '_'))
- return false;
+ if (name[0] == '\0')
+ return -EINVAL;
+
+ for (i = 0; name[i] != '\0' && i < MAX_TBF_NAME; i++) {
+ if (!isalnum(name[i]) && name[i] != '_')
+ return -EINVAL;
}
- return true;
+
+ if (i == MAX_TBF_NAME)
+ return -ENAMETOOLONG;
+
+ return 0;
}
static int
else
return -EINVAL;
} else if (strcmp(key, "rank") == 0) {
- if (!name_is_valid(val))
- return -EINVAL;
+ rc = check_rule_name(val);
+ if (rc)
+ return rc;
if (cmd->tc_cmd == NRS_CTL_TBF_START_RULE)
cmd->u.tc_start.ts_next_name = val;
/* Name of the rule */
token = strsep(&val, " ");
- if ((val == NULL && cmd->tc_cmd != NRS_CTL_TBF_STOP_RULE) ||
- !name_is_valid(token))
+ if ((val == NULL && cmd->tc_cmd != NRS_CTL_TBF_STOP_RULE))
GOTO(out_free_cmd, rc = -EINVAL);
+
+ rc = check_rule_name(token);
+ if (rc)
+ GOTO(out_free_cmd, rc);
+
cmd->tc_name = token;
if (cmd->tc_cmd == NRS_CTL_TBF_START_RULE) {
}
run_test 77q "Parallel TBF rule definitions should not panic"
+test_77p() {
+ local c
+ local -a spec_chars=(
+ '@' '.' '~' '#' '/' '^' '%' '*' ';' ',' '?' '<' '>' ':'
+ '+' '=' ')' '(' '{' '}' '|' '[' ']' '!' '&' '\$' '\`' '\\')
+
+ (( $MDS1_VERSION > $(version_code 2.14.54) )) ||
+ skip "need MDS >= 2.14.54"
+
+ do_facet mds1 $LCTL set_param mds.MDS.mdt.nrs_policies="tbf"
+ stack_trap "do_facet mds1 $LCTL set_param mds.MDS.mdt.nrs_policies=fifo"
+
+ # TBF rule name size is 16 bytes
+ do_facet mds1 $LCTL set_param mds.MDS.mdt.nrs_tbf_rule="start\ test_77p_overflo\ uid={500}\ rate=500" &&
+ error "The length of tbf rule name is not checked" || true
+ do_facet mds1 $LCTL set_param mds.MDS.mdt.nrs_tbf_rule="start\ \ uid={500}\ rate=500" &&
+ error "The server should not accept empty tbf rule name" || true
+ do_facet mds1 $LCTL set_param mds.MDS.mdt.nrs_tbf_rule="start\ test_77p_empty" &&
+ error "The server should not accept 'start <tbf_rule_name>' without an expression" || true
+
+ # Test with special chars
+ for c in "${spec_chars[@]}"; do
+ do_facet mds1 $LCTL set_param mds.MDS.mdt.nrs_tbf_rule="'start test77p${c}spec uid={500} rate=500'" &&
+ error "Special char '${c}' should not be accepted in a tbf rule name" || true
+ done
+
+}
+run_test 77p "Check validity of rule names for TBF policies"
+
test_78() { #LU-6673
local rc