forked from luck/tmp_suning_uos_patched
devlink: Add helper function for safely copy string param
Devlink string param buffer is allocated at the size of DEVLINK_PARAM_MAX_STRING_VALUE. Add helper function which makes sure this size is not exceeded. Renamed DEVLINK_PARAM_MAX_STRING_VALUE to __DEVLINK_PARAM_MAX_STRING_VALUE to emphasize that it should be used by devlink only. The driver should use the helper function instead to verify it doesn't exceed the allowed length. Signed-off-by: Moshe Shemesh <moshe@mellanox.com> Acked-by: Jiri Pirko <jiri@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
1276534c98
commit
bde74ad10e
|
@ -298,7 +298,7 @@ struct devlink_resource {
|
|||
|
||||
#define DEVLINK_RESOURCE_ID_PARENT_TOP 0
|
||||
|
||||
#define DEVLINK_PARAM_MAX_STRING_VALUE 32
|
||||
#define __DEVLINK_PARAM_MAX_STRING_VALUE 32
|
||||
enum devlink_param_type {
|
||||
DEVLINK_PARAM_TYPE_U8,
|
||||
DEVLINK_PARAM_TYPE_U16,
|
||||
|
@ -311,7 +311,7 @@ union devlink_param_value {
|
|||
u8 vu8;
|
||||
u16 vu16;
|
||||
u32 vu32;
|
||||
char vstr[DEVLINK_PARAM_MAX_STRING_VALUE];
|
||||
char vstr[__DEVLINK_PARAM_MAX_STRING_VALUE];
|
||||
bool vbool;
|
||||
};
|
||||
|
||||
|
@ -553,6 +553,8 @@ int devlink_param_driverinit_value_get(struct devlink *devlink, u32 param_id,
|
|||
int devlink_param_driverinit_value_set(struct devlink *devlink, u32 param_id,
|
||||
union devlink_param_value init_val);
|
||||
void devlink_param_value_changed(struct devlink *devlink, u32 param_id);
|
||||
void devlink_param_value_str_fill(union devlink_param_value *dst_val,
|
||||
const char *src);
|
||||
struct devlink_region *devlink_region_create(struct devlink *devlink,
|
||||
const char *region_name,
|
||||
u32 region_max_snapshots,
|
||||
|
@ -789,6 +791,12 @@ devlink_param_value_changed(struct devlink *devlink, u32 param_id)
|
|||
{
|
||||
}
|
||||
|
||||
static inline void
|
||||
devlink_param_value_str_fill(union devlink_param_value *dst_val,
|
||||
const char *src)
|
||||
{
|
||||
}
|
||||
|
||||
static inline struct devlink_region *
|
||||
devlink_region_create(struct devlink *devlink,
|
||||
const char *region_name,
|
||||
|
|
|
@ -3015,7 +3015,7 @@ devlink_param_value_get_from_info(const struct devlink_param *param,
|
|||
len = strnlen(nla_data(info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA]),
|
||||
nla_len(info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA]));
|
||||
if (len == nla_len(info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA]) ||
|
||||
len >= DEVLINK_PARAM_MAX_STRING_VALUE)
|
||||
len >= __DEVLINK_PARAM_MAX_STRING_VALUE)
|
||||
return -EINVAL;
|
||||
strcpy(value->vstr,
|
||||
nla_data(info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA]));
|
||||
|
@ -4617,6 +4617,23 @@ void devlink_param_value_changed(struct devlink *devlink, u32 param_id)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(devlink_param_value_changed);
|
||||
|
||||
/**
|
||||
* devlink_param_value_str_fill - Safely fill-up the string preventing
|
||||
* from overflow of the preallocated buffer
|
||||
*
|
||||
* @dst_val: destination devlink_param_value
|
||||
* @src: source buffer
|
||||
*/
|
||||
void devlink_param_value_str_fill(union devlink_param_value *dst_val,
|
||||
const char *src)
|
||||
{
|
||||
size_t len;
|
||||
|
||||
len = strlcpy(dst_val->vstr, src, __DEVLINK_PARAM_MAX_STRING_VALUE);
|
||||
WARN_ON(len >= __DEVLINK_PARAM_MAX_STRING_VALUE);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(devlink_param_value_str_fill);
|
||||
|
||||
/**
|
||||
* devlink_region_create - create a new address region
|
||||
*
|
||||
|
|
Loading…
Reference in New Issue
Block a user