@@ -128,7 +128,7 @@ static bool klp_is_patch_registered(struct klp_patch *patch)
128
128
129
129
static bool klp_initialized (void )
130
130
{
131
- return klp_root_kobj ;
131
+ return !! klp_root_kobj ;
132
132
}
133
133
134
134
struct klp_find_arg {
@@ -179,7 +179,9 @@ static int klp_find_object_symbol(const char *objname, const char *name,
179
179
.count = 0
180
180
};
181
181
182
+ mutex_lock (& module_mutex );
182
183
kallsyms_on_each_symbol (klp_find_callback , & args );
184
+ mutex_unlock (& module_mutex );
183
185
184
186
if (args .count == 0 )
185
187
pr_err ("symbol '%s' not found in symbol table\n" , name );
@@ -219,13 +221,19 @@ static int klp_verify_vmlinux_symbol(const char *name, unsigned long addr)
219
221
.name = name ,
220
222
.addr = addr ,
221
223
};
224
+ int ret ;
222
225
223
- if (kallsyms_on_each_symbol (klp_verify_callback , & args ))
224
- return 0 ;
226
+ mutex_lock (& module_mutex );
227
+ ret = kallsyms_on_each_symbol (klp_verify_callback , & args );
228
+ mutex_unlock (& module_mutex );
225
229
226
- pr_err ("symbol '%s' not found at specified address 0x%016lx, kernel mismatch?\n" ,
227
- name , addr );
228
- return - EINVAL ;
230
+ if (!ret ) {
231
+ pr_err ("symbol '%s' not found at specified address 0x%016lx, kernel mismatch?\n" ,
232
+ name , addr );
233
+ return - EINVAL ;
234
+ }
235
+
236
+ return 0 ;
229
237
}
230
238
231
239
static int klp_find_verify_func_addr (struct klp_object * obj ,
@@ -234,8 +242,9 @@ static int klp_find_verify_func_addr(struct klp_object *obj,
234
242
int ret ;
235
243
236
244
#if defined(CONFIG_RANDOMIZE_BASE )
237
- /* KASLR is enabled, disregard old_addr from user */
238
- func -> old_addr = 0 ;
245
+ /* If KASLR has been enabled, adjust old_addr accordingly */
246
+ if (kaslr_enabled () && func -> old_addr )
247
+ func -> old_addr += kaslr_offset ();
239
248
#endif
240
249
241
250
if (!func -> old_addr || klp_is_module (obj ))
@@ -422,7 +431,7 @@ static void klp_disable_object(struct klp_object *obj)
422
431
{
423
432
struct klp_func * func ;
424
433
425
- for ( func = obj -> funcs ; func -> old_name ; func ++ )
434
+ klp_for_each_func ( obj , func )
426
435
if (func -> state == KLP_ENABLED )
427
436
klp_disable_func (func );
428
437
@@ -440,7 +449,7 @@ static int klp_enable_object(struct klp_object *obj)
440
449
if (WARN_ON (!klp_is_object_loaded (obj )))
441
450
return - EINVAL ;
442
451
443
- for ( func = obj -> funcs ; func -> old_name ; func ++ ) {
452
+ klp_for_each_func ( obj , func ) {
444
453
ret = klp_enable_func (func );
445
454
if (ret ) {
446
455
klp_disable_object (obj );
@@ -463,7 +472,7 @@ static int __klp_disable_patch(struct klp_patch *patch)
463
472
464
473
pr_notice ("disabling patch '%s'\n" , patch -> mod -> name );
465
474
466
- for ( obj = patch -> objs ; obj -> funcs ; obj ++ ) {
475
+ klp_for_each_object ( patch , obj ) {
467
476
if (obj -> state == KLP_ENABLED )
468
477
klp_disable_object (obj );
469
478
}
@@ -523,7 +532,7 @@ static int __klp_enable_patch(struct klp_patch *patch)
523
532
524
533
pr_notice ("enabling patch '%s'\n" , patch -> mod -> name );
525
534
526
- for ( obj = patch -> objs ; obj -> funcs ; obj ++ ) {
535
+ klp_for_each_object ( patch , obj ) {
527
536
if (!klp_is_object_loaded (obj ))
528
537
continue ;
529
538
@@ -651,6 +660,15 @@ static struct kobj_type klp_ktype_patch = {
651
660
.default_attrs = klp_patch_attrs ,
652
661
};
653
662
663
+ static void klp_kobj_release_object (struct kobject * kobj )
664
+ {
665
+ }
666
+
667
+ static struct kobj_type klp_ktype_object = {
668
+ .release = klp_kobj_release_object ,
669
+ .sysfs_ops = & kobj_sysfs_ops ,
670
+ };
671
+
654
672
static void klp_kobj_release_func (struct kobject * kobj )
655
673
{
656
674
}
@@ -680,7 +698,7 @@ static void klp_free_object_loaded(struct klp_object *obj)
680
698
681
699
obj -> mod = NULL ;
682
700
683
- for ( func = obj -> funcs ; func -> old_name ; func ++ )
701
+ klp_for_each_func ( obj , func )
684
702
func -> old_addr = 0 ;
685
703
}
686
704
@@ -695,7 +713,7 @@ static void klp_free_objects_limited(struct klp_patch *patch,
695
713
696
714
for (obj = patch -> objs ; obj -> funcs && obj != limit ; obj ++ ) {
697
715
klp_free_funcs_limited (obj , NULL );
698
- kobject_put (obj -> kobj );
716
+ kobject_put (& obj -> kobj );
699
717
}
700
718
}
701
719
@@ -713,7 +731,7 @@ static int klp_init_func(struct klp_object *obj, struct klp_func *func)
713
731
func -> state = KLP_DISABLED ;
714
732
715
733
return kobject_init_and_add (& func -> kobj , & klp_ktype_func ,
716
- obj -> kobj , "%s" , func -> old_name );
734
+ & obj -> kobj , "%s" , func -> old_name );
717
735
}
718
736
719
737
/* parts of the initialization that is done only when the object is loaded */
@@ -729,7 +747,7 @@ static int klp_init_object_loaded(struct klp_patch *patch,
729
747
return ret ;
730
748
}
731
749
732
- for ( func = obj -> funcs ; func -> old_name ; func ++ ) {
750
+ klp_for_each_func ( obj , func ) {
733
751
ret = klp_find_verify_func_addr (obj , func );
734
752
if (ret )
735
753
return ret ;
@@ -753,11 +771,12 @@ static int klp_init_object(struct klp_patch *patch, struct klp_object *obj)
753
771
klp_find_object_module (obj );
754
772
755
773
name = klp_is_module (obj ) ? obj -> name : "vmlinux" ;
756
- obj -> kobj = kobject_create_and_add (name , & patch -> kobj );
757
- if (!obj -> kobj )
758
- return - ENOMEM ;
774
+ ret = kobject_init_and_add (& obj -> kobj , & klp_ktype_object ,
775
+ & patch -> kobj , "%s" , name );
776
+ if (ret )
777
+ return ret ;
759
778
760
- for ( func = obj -> funcs ; func -> old_name ; func ++ ) {
779
+ klp_for_each_func ( obj , func ) {
761
780
ret = klp_init_func (obj , func );
762
781
if (ret )
763
782
goto free ;
@@ -773,7 +792,7 @@ static int klp_init_object(struct klp_patch *patch, struct klp_object *obj)
773
792
774
793
free :
775
794
klp_free_funcs_limited (obj , func );
776
- kobject_put (obj -> kobj );
795
+ kobject_put (& obj -> kobj );
777
796
return ret ;
778
797
}
779
798
@@ -794,7 +813,7 @@ static int klp_init_patch(struct klp_patch *patch)
794
813
if (ret )
795
814
goto unlock ;
796
815
797
- for ( obj = patch -> objs ; obj -> funcs ; obj ++ ) {
816
+ klp_for_each_object ( patch , obj ) {
798
817
ret = klp_init_object (patch , obj );
799
818
if (ret )
800
819
goto free ;
@@ -883,30 +902,31 @@ int klp_register_patch(struct klp_patch *patch)
883
902
}
884
903
EXPORT_SYMBOL_GPL (klp_register_patch );
885
904
886
- static void klp_module_notify_coming (struct klp_patch * patch ,
905
+ static int klp_module_notify_coming (struct klp_patch * patch ,
887
906
struct klp_object * obj )
888
907
{
889
908
struct module * pmod = patch -> mod ;
890
909
struct module * mod = obj -> mod ;
891
910
int ret ;
892
911
893
912
ret = klp_init_object_loaded (patch , obj );
894
- if (ret )
895
- goto err ;
913
+ if (ret ) {
914
+ pr_warn ("failed to initialize patch '%s' for module '%s' (%d)\n" ,
915
+ pmod -> name , mod -> name , ret );
916
+ return ret ;
917
+ }
896
918
897
919
if (patch -> state == KLP_DISABLED )
898
- return ;
920
+ return 0 ;
899
921
900
922
pr_notice ("applying patch '%s' to loading module '%s'\n" ,
901
923
pmod -> name , mod -> name );
902
924
903
925
ret = klp_enable_object (obj );
904
- if (!ret )
905
- return ;
906
-
907
- err :
908
- pr_warn ("failed to apply patch '%s' to module '%s' (%d)\n" ,
909
- pmod -> name , mod -> name , ret );
926
+ if (ret )
927
+ pr_warn ("failed to apply patch '%s' to module '%s' (%d)\n" ,
928
+ pmod -> name , mod -> name , ret );
929
+ return ret ;
910
930
}
911
931
912
932
static void klp_module_notify_going (struct klp_patch * patch ,
@@ -930,6 +950,7 @@ static void klp_module_notify_going(struct klp_patch *patch,
930
950
static int klp_module_notify (struct notifier_block * nb , unsigned long action ,
931
951
void * data )
932
952
{
953
+ int ret ;
933
954
struct module * mod = data ;
934
955
struct klp_patch * patch ;
935
956
struct klp_object * obj ;
@@ -949,13 +970,18 @@ static int klp_module_notify(struct notifier_block *nb, unsigned long action,
949
970
mod -> klp_alive = false;
950
971
951
972
list_for_each_entry (patch , & klp_patches , list ) {
952
- for ( obj = patch -> objs ; obj -> funcs ; obj ++ ) {
973
+ klp_for_each_object ( patch , obj ) {
953
974
if (!klp_is_module (obj ) || strcmp (obj -> name , mod -> name ))
954
975
continue ;
955
976
956
977
if (action == MODULE_STATE_COMING ) {
957
978
obj -> mod = mod ;
958
- klp_module_notify_coming (patch , obj );
979
+ ret = klp_module_notify_coming (patch , obj );
980
+ if (ret ) {
981
+ obj -> mod = NULL ;
982
+ pr_warn ("patch '%s' is in an inconsistent state!\n" ,
983
+ patch -> mod -> name );
984
+ }
959
985
} else /* MODULE_STATE_GOING */
960
986
klp_module_notify_going (patch , obj );
961
987
@@ -973,7 +999,7 @@ static struct notifier_block klp_module_nb = {
973
999
.priority = INT_MIN + 1 , /* called late but before ftrace notifier */
974
1000
};
975
1001
976
- static int klp_init (void )
1002
+ static int __init klp_init (void )
977
1003
{
978
1004
int ret ;
979
1005
0 commit comments