@@ -3057,34 +3057,24 @@ SYSCALL_DEFINE3(init_module, void __user *, umod,
3057
3057
return load_module (& info , uargs , 0 );
3058
3058
}
3059
3059
3060
- SYSCALL_DEFINE3 ( finit_module , int , fd , const char __user * , uargs , int , flags )
3060
+ static int init_module_from_file ( struct file * f , const char __user * uargs , int flags )
3061
3061
{
3062
3062
struct load_info info = { };
3063
3063
void * buf = NULL ;
3064
3064
int len ;
3065
- int err ;
3066
-
3067
- err = may_init_module ();
3068
- if (err )
3069
- return err ;
3070
3065
3071
- pr_debug ("finit_module: fd=%d, uargs=%p, flags=%i\n" , fd , uargs , flags );
3066
+ if (!f || !(f -> f_mode & FMODE_READ ))
3067
+ return - EBADF ;
3072
3068
3073
- if (flags & ~(MODULE_INIT_IGNORE_MODVERSIONS
3074
- |MODULE_INIT_IGNORE_VERMAGIC
3075
- |MODULE_INIT_COMPRESSED_FILE ))
3076
- return - EINVAL ;
3077
-
3078
- len = kernel_read_file_from_fd (fd , 0 , & buf , INT_MAX , NULL ,
3079
- READING_MODULE );
3069
+ len = kernel_read_file (f , 0 , & buf , INT_MAX , NULL , READING_MODULE );
3080
3070
if (len < 0 ) {
3081
3071
mod_stat_inc (& failed_kreads );
3082
3072
mod_stat_add_long (len , & invalid_kread_bytes );
3083
3073
return len ;
3084
3074
}
3085
3075
3086
3076
if (flags & MODULE_INIT_COMPRESSED_FILE ) {
3087
- err = module_decompress (& info , buf , len );
3077
+ int err = module_decompress (& info , buf , len );
3088
3078
vfree (buf ); /* compressed data is no longer needed */
3089
3079
if (err ) {
3090
3080
mod_stat_inc (& failed_decompress );
@@ -3099,6 +3089,28 @@ SYSCALL_DEFINE3(finit_module, int, fd, const char __user *, uargs, int, flags)
3099
3089
return load_module (& info , uargs , flags );
3100
3090
}
3101
3091
3092
+ SYSCALL_DEFINE3 (finit_module , int , fd , const char __user * , uargs , int , flags )
3093
+ {
3094
+ int err ;
3095
+ struct fd f ;
3096
+
3097
+ err = may_init_module ();
3098
+ if (err )
3099
+ return err ;
3100
+
3101
+ pr_debug ("finit_module: fd=%d, uargs=%p, flags=%i\n" , fd , uargs , flags );
3102
+
3103
+ if (flags & ~(MODULE_INIT_IGNORE_MODVERSIONS
3104
+ |MODULE_INIT_IGNORE_VERMAGIC
3105
+ |MODULE_INIT_COMPRESSED_FILE ))
3106
+ return - EINVAL ;
3107
+
3108
+ f = fdget (fd );
3109
+ err = init_module_from_file (f .file , uargs , flags );
3110
+ fdput (f );
3111
+ return err ;
3112
+ }
3113
+
3102
3114
/* Keep in sync with MODULE_FLAGS_BUF_SIZE !!! */
3103
3115
char * module_flags (struct module * mod , char * buf , bool show_state )
3104
3116
{
0 commit comments