Skip to content

Commit

Permalink
mdopen: add sbin path to env PATH when call system("modprobe md_mod")
Browse files Browse the repository at this point in the history
During the boot process if mdadm is called in udev context, sbin paths
like /sbin, /usr/sbin, /usr/local/sbin normally not defined in PATH env
variable, calling system("modprobe md_mod") in create_named_array() may
fail with 'sh: modprobe: command not found' error message.

We don't want to move modprobe binary into udev private directory, so
setting the PATH env is a more proper method to avoid the above issue.

This patch sets PATH env variable with "/sbin:/usr/sbin:/usr/local/sbin"
before calling system("modprobe md_mod"). The change only takes effect
within the udev worker context, not seen by global udev environment.

Signed-off-by: Coly Li <[email protected]>
Signed-off-by: Mariusz Tkaczyk <[email protected]>
  • Loading branch information
Coly Li authored and mtkaczyk committed Jan 27, 2025
1 parent e0df6c4 commit b1ee932
Showing 1 changed file with 18 additions and 0 deletions.
18 changes: 18 additions & 0 deletions mdopen.c
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,24 @@ int create_named_array(char *devnm)

fd = open(new_array_file, O_WRONLY);
if (fd < 0 && errno == ENOENT) {
char buf[PATH_MAX] = {0};
char *env_ptr;

env_ptr = getenv("PATH");
/*
* When called by udev worker context, path of modprobe
* might not be in env PATH. Set sbin paths into PATH
* env to avoid potential failure when run modprobe here.
*/
if (env_ptr)
snprintf(buf, PATH_MAX - 1, "%s:%s", env_ptr,
"/sbin:/usr/sbin:/usr/local/sbin");
else
snprintf(buf, PATH_MAX - 1, "%s",
"/sbin:/usr/sbin:/usr/local/sbin");

setenv("PATH", buf, 1);

if (system("modprobe md_mod") == 0)
fd = open(new_array_file, O_WRONLY);
}
Expand Down

0 comments on commit b1ee932

Please sign in to comment.