|
@@ -778,6 +778,9 @@ static void wait_for_zero_refcount(struct module *mod)
|
|
mutex_lock(&module_mutex);
|
|
mutex_lock(&module_mutex);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+/* Block module loading/unloading? */
|
|
|
|
+int modules_disabled = 0;
|
|
|
|
+
|
|
SYSCALL_DEFINE2(delete_module, const char __user *, name_user,
|
|
SYSCALL_DEFINE2(delete_module, const char __user *, name_user,
|
|
unsigned int, flags)
|
|
unsigned int, flags)
|
|
{
|
|
{
|
|
@@ -785,7 +788,7 @@ SYSCALL_DEFINE2(delete_module, const char __user *, name_user,
|
|
char name[MODULE_NAME_LEN];
|
|
char name[MODULE_NAME_LEN];
|
|
int ret, forced = 0;
|
|
int ret, forced = 0;
|
|
|
|
|
|
- if (!capable(CAP_SYS_MODULE))
|
|
|
|
|
|
+ if (!capable(CAP_SYS_MODULE) || modules_disabled)
|
|
return -EPERM;
|
|
return -EPERM;
|
|
|
|
|
|
if (strncpy_from_user(name, name_user, MODULE_NAME_LEN-1) < 0)
|
|
if (strncpy_from_user(name, name_user, MODULE_NAME_LEN-1) < 0)
|
|
@@ -2349,7 +2352,7 @@ SYSCALL_DEFINE3(init_module, void __user *, umod,
|
|
int ret = 0;
|
|
int ret = 0;
|
|
|
|
|
|
/* Must have permission */
|
|
/* Must have permission */
|
|
- if (!capable(CAP_SYS_MODULE))
|
|
|
|
|
|
+ if (!capable(CAP_SYS_MODULE) || modules_disabled)
|
|
return -EPERM;
|
|
return -EPERM;
|
|
|
|
|
|
/* Only one module load at a time, please */
|
|
/* Only one module load at a time, please */
|