aboutsummaryrefslogtreecommitdiffstats
path: root/net/core/devlink.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/core/devlink.c')
-rw-r--r--net/core/devlink.c43
1 files changed, 37 insertions, 6 deletions
diff --git a/net/core/devlink.c b/net/core/devlink.c
index 6dae81d65d5c..3a4b29a13d31 100644
--- a/net/core/devlink.c
+++ b/net/core/devlink.c
@@ -3012,6 +3012,8 @@ devlink_param_value_get_from_info(const struct devlink_param *param,
3012 struct genl_info *info, 3012 struct genl_info *info,
3013 union devlink_param_value *value) 3013 union devlink_param_value *value)
3014{ 3014{
3015 int len;
3016
3015 if (param->type != DEVLINK_PARAM_TYPE_BOOL && 3017 if (param->type != DEVLINK_PARAM_TYPE_BOOL &&
3016 !info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA]) 3018 !info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA])
3017 return -EINVAL; 3019 return -EINVAL;
@@ -3027,10 +3029,13 @@ devlink_param_value_get_from_info(const struct devlink_param *param,
3027 value->vu32 = nla_get_u32(info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA]); 3029 value->vu32 = nla_get_u32(info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA]);
3028 break; 3030 break;
3029 case DEVLINK_PARAM_TYPE_STRING: 3031 case DEVLINK_PARAM_TYPE_STRING:
3030 if (nla_len(info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA]) > 3032 len = strnlen(nla_data(info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA]),
3031 DEVLINK_PARAM_MAX_STRING_VALUE) 3033 nla_len(info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA]));
3034 if (len == nla_len(info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA]) ||
3035 len >= __DEVLINK_PARAM_MAX_STRING_VALUE)
3032 return -EINVAL; 3036 return -EINVAL;
3033 value->vstr = nla_data(info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA]); 3037 strcpy(value->vstr,
3038 nla_data(info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA]));
3034 break; 3039 break;
3035 case DEVLINK_PARAM_TYPE_BOOL: 3040 case DEVLINK_PARAM_TYPE_BOOL:
3036 value->vbool = info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA] ? 3041 value->vbool = info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA] ?
@@ -3117,7 +3122,10 @@ static int devlink_nl_cmd_param_set_doit(struct sk_buff *skb,
3117 return -EOPNOTSUPP; 3122 return -EOPNOTSUPP;
3118 3123
3119 if (cmode == DEVLINK_PARAM_CMODE_DRIVERINIT) { 3124 if (cmode == DEVLINK_PARAM_CMODE_DRIVERINIT) {
3120 param_item->driverinit_value = value; 3125 if (param->type == DEVLINK_PARAM_TYPE_STRING)
3126 strcpy(param_item->driverinit_value.vstr, value.vstr);
3127 else
3128 param_item->driverinit_value = value;
3121 param_item->driverinit_value_valid = true; 3129 param_item->driverinit_value_valid = true;
3122 } else { 3130 } else {
3123 if (!param->set) 3131 if (!param->set)
@@ -4557,7 +4565,10 @@ int devlink_param_driverinit_value_get(struct devlink *devlink, u32 param_id,
4557 DEVLINK_PARAM_CMODE_DRIVERINIT)) 4565 DEVLINK_PARAM_CMODE_DRIVERINIT))
4558 return -EOPNOTSUPP; 4566 return -EOPNOTSUPP;
4559 4567
4560 *init_val = param_item->driverinit_value; 4568 if (param_item->param->type == DEVLINK_PARAM_TYPE_STRING)
4569 strcpy(init_val->vstr, param_item->driverinit_value.vstr);
4570 else
4571 *init_val = param_item->driverinit_value;
4561 4572
4562 return 0; 4573 return 0;
4563} 4574}
@@ -4588,7 +4599,10 @@ int devlink_param_driverinit_value_set(struct devlink *devlink, u32 param_id,
4588 DEVLINK_PARAM_CMODE_DRIVERINIT)) 4599 DEVLINK_PARAM_CMODE_DRIVERINIT))
4589 return -EOPNOTSUPP; 4600 return -EOPNOTSUPP;
4590 4601
4591 param_item->driverinit_value = init_val; 4602 if (param_item->param->type == DEVLINK_PARAM_TYPE_STRING)
4603 strcpy(param_item->driverinit_value.vstr, init_val.vstr);
4604 else
4605 param_item->driverinit_value = init_val;
4592 param_item->driverinit_value_valid = true; 4606 param_item->driverinit_value_valid = true;
4593 4607
4594 devlink_param_notify(devlink, param_item, DEVLINK_CMD_PARAM_NEW); 4608 devlink_param_notify(devlink, param_item, DEVLINK_CMD_PARAM_NEW);
@@ -4621,6 +4635,23 @@ void devlink_param_value_changed(struct devlink *devlink, u32 param_id)
4621EXPORT_SYMBOL_GPL(devlink_param_value_changed); 4635EXPORT_SYMBOL_GPL(devlink_param_value_changed);
4622 4636
4623/** 4637/**
4638 * devlink_param_value_str_fill - Safely fill-up the string preventing
4639 * from overflow of the preallocated buffer
4640 *
4641 * @dst_val: destination devlink_param_value
4642 * @src: source buffer
4643 */
4644void devlink_param_value_str_fill(union devlink_param_value *dst_val,
4645 const char *src)
4646{
4647 size_t len;
4648
4649 len = strlcpy(dst_val->vstr, src, __DEVLINK_PARAM_MAX_STRING_VALUE);
4650 WARN_ON(len >= __DEVLINK_PARAM_MAX_STRING_VALUE);
4651}
4652EXPORT_SYMBOL_GPL(devlink_param_value_str_fill);
4653
4654/**
4624 * devlink_region_create - create a new address region 4655 * devlink_region_create - create a new address region
4625 * 4656 *
4626 * @devlink: devlink 4657 * @devlink: devlink