Skip to content

Commit

Permalink
proc: sysctl: prevent aliased sysctls from getting passed to init
Browse files Browse the repository at this point in the history
commit 8001f49 upstream.

The code that checks for unknown boot options is unaware of the sysctl
alias facility, which maps bootparams to sysctl values.  If a user sets
an old value that has a valid alias, a message about an invalid
parameter will be printed during boot, and the parameter will get passed
to init.  Fix by checking for the existence of aliased parameters in the
unknown boot parameter code.  If an alias exists, don't return an error
or pass the value to init.

Signed-off-by: Krister Johansen <kjlx@templeofstupid.com>
Cc: stable@vger.kernel.org
Fixes: 0a477e1 ("kernel/sysctl: support handling command line aliases")
Signed-off-by: Luis Chamberlain <mcgrof@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
kmjohansen authored and gregkh committed Nov 28, 2023
1 parent d91fd02 commit 5b2352c
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 0 deletions.
7 changes: 7 additions & 0 deletions fs/proc/proc_sysctl.c
Original file line number Diff line number Diff line change
Expand Up @@ -1830,6 +1830,13 @@ static const char *sysctl_find_alias(char *param)
return NULL;
}

bool sysctl_is_alias(char *param)
{
const char *alias = sysctl_find_alias(param);

return alias != NULL;
}

/* Set sysctl value passed on kernel command line. */
static int process_sysctl_arg(char *param, char *val,
const char *unused, void *arg)
Expand Down
6 changes: 6 additions & 0 deletions include/linux/sysctl.h
Original file line number Diff line number Diff line change
Expand Up @@ -238,6 +238,7 @@ extern void __register_sysctl_init(const char *path, struct ctl_table *table,
extern struct ctl_table_header *register_sysctl_mount_point(const char *path);

void do_sysctl_args(void);
bool sysctl_is_alias(char *param);
int do_proc_douintvec(struct ctl_table *table, int write,
void *buffer, size_t *lenp, loff_t *ppos,
int (*conv)(unsigned long *lvalp,
Expand Down Expand Up @@ -301,6 +302,11 @@ static inline void setup_sysctl_set(struct ctl_table_set *p,
static inline void do_sysctl_args(void)
{
}

static inline bool sysctl_is_alias(char *param)
{
return false;
}
#endif /* CONFIG_SYSCTL */

int sysctl_max_threads(struct ctl_table *table, int write, void *buffer,
Expand Down
4 changes: 4 additions & 0 deletions init/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -533,6 +533,10 @@ static int __init unknown_bootoption(char *param, char *val,
{
size_t len = strlen(param);

/* Handle params aliased to sysctls */
if (sysctl_is_alias(param))
return 0;

repair_env_string(param, val);

/* Handle obsolete-style parameters */
Expand Down

0 comments on commit 5b2352c

Please sign in to comment.