On recent systems, calls to /sbin/modprobe are handled by udev depending on the kind of device the kernel has discovered. This patch creates an uevent for the kernels internal request_module(), to let udev take control over the request, instead of forking the binary directly by the kernel. The direct execution of /sbin/modprobe can be disabled by setting: /sys/module/kmod/mod_request_helper (/proc/sys/kernel/modprobe) to an empty string, the same way /proc/sys/kernel/hotplug is disabled on an udev system.
Showing the changes to kernel/module.c (1 of 4 files). Show all
Unified · Split
| @@ -653,20 +653,11 @@ static void wait_for_zero_refcount(struct module *mod) · 652 unmodified lines | ||
| 653 | 653 | mutex_lock(&module_mutex); |
| 654 | 654 | } |
| 655 | 655 | |
| 656 | −asmlinkage long | |
| 657 | −sys_delete_module(const char __user *name_user, unsigned int flags) | |
| 656 | +int delete_module(const char *name, unsigned int flags) | |
| 658 | 657 | { |
| 659 | 658 | struct module *mod; |
| 660 | − char name[MODULE_NAME_LEN]; | |
| 661 | 659 | int ret, forced = 0; |
| 662 | 660 | |
| 663 | − if (!capable(CAP_SYS_MODULE)) | |
| 664 | − return -EPERM; | |
| 665 | − | |
| 666 | − if (strncpy_from_user(name, name_user, MODULE_NAME_LEN-1) < 0) | |
| 667 | − return -EFAULT; | |
| 668 | − name[MODULE_NAME_LEN-1] = '\0'; | |
| 669 | − | |
| 670 | 661 | if (mutex_lock_interruptible(&module_mutex) != 0) |
| 671 | 662 | return -EINTR; |
| 672 | 663 | |
| @@ -727,6 +718,21 @@ sys_delete_module(const char __user *name_user, unsigned int flags) · 54 unmodified lines | ||
| 727 | 718 | return ret; |
| 728 | 719 | } |
| 729 | 720 | |
| 721 | +asmlinkage long | |
| 722 | +sys_delete_module(const char __user *name_user, unsigned int flags) | |
| 723 | +{ | |
| 724 | + char name[MODULE_NAME_LEN]; | |
| 725 | + | |
| 726 | + if (!capable(CAP_SYS_MODULE)) | |
| 727 | + return -EPERM; | |
| 728 | + | |
| 729 | + if (strncpy_from_user(name, name_user, MODULE_NAME_LEN-1) < 0) | |
| 730 | + return -EFAULT; | |
| 731 | + name[MODULE_NAME_LEN-1] = '\0'; | |
| 732 | + | |
| 733 | + return delete_module(name, flags); | |
| 734 | +} | |
| 735 | + | |
| 730 | 736 | static void print_unload_info(struct seq_file *m, struct module *mod) |
| 731 | 737 | { |
| 732 | 738 | struct module_use *use; |