Skip to content

Commit

Permalink
param: check for tainting before calling set op.
Browse files Browse the repository at this point in the history
This means every set op doesn't need to call it, and it can move into
params.c.

Signed-off-by: Rusty Russell <[email protected]>
  • Loading branch information
rustyrussell committed Aug 27, 2014
1 parent fc9740c commit 7a486d3
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 27 deletions.
16 changes: 0 additions & 16 deletions include/linux/moduleparam.h
Original file line number Diff line number Diff line change
Expand Up @@ -374,22 +374,6 @@ static inline void destroy_params(const struct kernel_param *params,
#define __param_check(name, p, type) \
static inline type __always_unused *__check_##name(void) { return(p); }

/**
* param_check_unsafe - Warn and taint the kernel if setting dangerous options.
*
* This gets called from all the standard param setters, but can be used from
* custom setters as well.
*/
static inline void
param_check_unsafe(const struct kernel_param *kp)
{
if (kp->flags & KERNEL_PARAM_FL_UNSAFE) {
pr_warn("Setting dangerous option %s - tainting kernel\n",
kp->name);
add_taint(TAINT_USER, LOCKDEP_STILL_OK);
}
}

extern struct kernel_param_ops param_ops_byte;
extern int param_set_byte(const char *val, const struct kernel_param *kp);
extern int param_get_byte(char *buffer, const struct kernel_param *kp);
Expand Down
22 changes: 11 additions & 11 deletions kernel/params.c
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,15 @@ bool parameq(const char *a, const char *b)
return parameqn(a, b, strlen(a)+1);
}

static void param_check_unsafe(const struct kernel_param *kp)
{
if (kp->flags & KERNEL_PARAM_FL_UNSAFE) {
pr_warn("Setting dangerous option %s - tainting kernel\n",
kp->name);
add_taint(TAINT_USER, LOCKDEP_STILL_OK);
}
}

static int parse_one(char *param,
char *val,
const char *doing,
Expand All @@ -109,6 +118,7 @@ static int parse_one(char *param,
pr_debug("handling %s with %p\n", param,
params[i].ops->set);
mutex_lock(&param_lock);
param_check_unsafe(&params[i]);
err = params[i].ops->set(val, &params[i]);
mutex_unlock(&param_lock);
return err;
Expand Down Expand Up @@ -233,7 +243,6 @@ char *parse_args(const char *doing,
#define STANDARD_PARAM_DEF(name, type, format, strtolfn) \
int param_set_##name(const char *val, const struct kernel_param *kp) \
{ \
param_check_unsafe(kp); \
return strtolfn(val, 0, (type *)kp->arg); \
} \
int param_get_##name(char *buffer, const struct kernel_param *kp) \
Expand Down Expand Up @@ -266,8 +275,6 @@ int param_set_charp(const char *val, const struct kernel_param *kp)
return -ENOSPC;
}

param_check_unsafe(kp);

maybe_kfree_parameter(*(char **)kp->arg);

/* This is a hack. We can't kmalloc in early boot, and we
Expand Down Expand Up @@ -305,8 +312,6 @@ EXPORT_SYMBOL(param_ops_charp);
/* Actually could be a bool or an int, for historical reasons. */
int param_set_bool(const char *val, const struct kernel_param *kp)
{
param_check_unsafe(kp);

/* No equals means "set"... */
if (!val) val = "1";

Expand Down Expand Up @@ -336,8 +341,6 @@ int param_set_invbool(const char *val, const struct kernel_param *kp)
bool boolval;
struct kernel_param dummy;

param_check_unsafe(kp);

dummy.arg = &boolval;
ret = param_set_bool(val, &dummy);
if (ret == 0)
Expand All @@ -364,8 +367,6 @@ int param_set_bint(const char *val, const struct kernel_param *kp)
bool v;
int ret;

param_check_unsafe(kp);

/* Match bool exactly, by re-using it. */
boolkp = *kp;
boolkp.arg = &v;
Expand Down Expand Up @@ -485,8 +486,6 @@ int param_set_copystring(const char *val, const struct kernel_param *kp)
{
const struct kparam_string *kps = kp->str;

param_check_unsafe(kp);

if (strlen(val)+1 > kps->maxlen) {
pr_err("%s: string doesn't fit in %u chars.\n",
kp->name, kps->maxlen-1);
Expand Down Expand Up @@ -563,6 +562,7 @@ static ssize_t param_attr_store(struct module_attribute *mattr,
return -EPERM;

mutex_lock(&param_lock);
param_check_unsafe(attribute->param);
err = attribute->param->ops->set(buf, attribute->param);
mutex_unlock(&param_lock);
if (!err)
Expand Down

0 comments on commit 7a486d3

Please sign in to comment.