Fix wrong probe_kernel_write() usage.
@@ -861,25 +861,21 @@ | ||
861 | 861 | |
862 | 862 | static bool __init check_ro_pages(struct security_hook_heads *hooks) |
863 | 863 | { |
864 | - struct list_head *list = (struct list_head *) hooks; | |
864 | + struct list_head *list = &hooks->capable; | |
865 | 865 | |
866 | - if (!probe_kernel_write(&list->next, list->next, sizeof(void *))) | |
866 | + if (!probe_kernel_write(list, list, sizeof(void *))) | |
867 | 867 | return true; |
868 | 868 | { |
869 | - const unsigned int idx = | |
870 | - ((unsigned long) kpr_hook.head - (unsigned long) hooks) | |
871 | - / sizeof(struct list_head); | |
872 | - struct list_head *self = &list[idx]; | |
873 | - struct list_head *prev = self->prev; | |
869 | + struct list_head *head = kpr_hook.head; | |
870 | + struct security_hook_list *shp; | |
874 | 871 | |
875 | - if (!lsm_test_page_ro(&prev->next) || | |
876 | - !lsm_test_page_ro(&self->prev)) | |
872 | + if (!lsm_test_page_ro(&head->next) || | |
873 | + !lsm_test_page_ro(&head->prev)) | |
877 | 874 | return false; |
878 | - if (!list_empty(self) && | |
879 | - !lsm_test_page_ro(&list_last_entry | |
880 | - (self, struct security_hook_list, | |
881 | - list)->hook)) | |
882 | - return false; | |
875 | + list_for_each_entry(shp, head, list) | |
876 | + if (!lsm_test_page_ro(&shp->list.next) || | |
877 | + !lsm_test_page_ro(&shp->list.prev)) | |
878 | + return false; | |
883 | 879 | } |
884 | 880 | return true; |
885 | 881 | } |
@@ -886,9 +882,9 @@ | ||
886 | 882 | #else |
887 | 883 | static bool __init check_ro_pages(struct security_hook_heads *hooks) |
888 | 884 | { |
889 | - return !probe_kernel_write(&((struct list_head *) hooks)->next, | |
890 | - ((struct list_head *) hooks)->next, | |
891 | - sizeof(void *)); | |
885 | + struct list_head *list = &hooks->capable; | |
886 | + | |
887 | + return !probe_kernel_write(list, list, sizeof(void *)); | |
892 | 888 | } |
893 | 889 | #endif |
894 | 890 | #endif |
@@ -658,26 +658,21 @@ | ||
658 | 658 | static bool __init check_ro_pages(struct security_hook_heads *hooks) |
659 | 659 | { |
660 | 660 | int i; |
661 | - struct list_head *list = (struct list_head *) hooks; | |
661 | + struct list_head *list = &hooks->capable; | |
662 | 662 | |
663 | - if (!probe_kernel_write(&list->next, list->next, sizeof(void *))) | |
663 | + if (!probe_kernel_write(list, list, sizeof(void *))) | |
664 | 664 | return true; |
665 | 665 | for (i = 0; i < ARRAY_SIZE(tt_hooks); i++) { |
666 | - const unsigned int idx = | |
667 | - ((unsigned long) tt_hooks[i].head | |
668 | - - (unsigned long) hooks) | |
669 | - / sizeof(struct list_head); | |
670 | - struct list_head *self = &list[idx]; | |
671 | - struct list_head *prev = self->prev; | |
666 | + struct list_head *head = tt_hooks[i].head; | |
667 | + struct security_hook_list *shp; | |
672 | 668 | |
673 | - if (!lsm_test_page_ro(&prev->next) || | |
674 | - !lsm_test_page_ro(&self->prev)) | |
669 | + if (!lsm_test_page_ro(&head->next) || | |
670 | + !lsm_test_page_ro(&head->prev)) | |
675 | 671 | return false; |
676 | - if (!list_empty(self) && | |
677 | - !lsm_test_page_ro(&list_last_entry | |
678 | - (self, struct security_hook_list, | |
679 | - list)->hook)) | |
680 | - return false; | |
672 | + list_for_each_entry(shp, head, list) | |
673 | + if (!lsm_test_page_ro(&shp->list.next) || | |
674 | + !lsm_test_page_ro(&shp->list.prev)) | |
675 | + return false; | |
681 | 676 | } |
682 | 677 | return true; |
683 | 678 | } |
@@ -684,9 +679,9 @@ | ||
684 | 679 | #else |
685 | 680 | static bool __init check_ro_pages(struct security_hook_heads *hooks) |
686 | 681 | { |
687 | - return !probe_kernel_write(&((struct list_head *) hooks)->next, | |
688 | - ((struct list_head *) hooks)->next, | |
689 | - sizeof(void *)); | |
682 | + struct list_head *list = &hooks->capable; | |
683 | + | |
684 | + return !probe_kernel_write(list, list, sizeof(void *)); | |
690 | 685 | } |
691 | 686 | #endif |
692 | 687 | #endif |
@@ -1068,26 +1068,21 @@ | ||
1068 | 1068 | static bool __init check_ro_pages(struct security_hook_heads *hooks) |
1069 | 1069 | { |
1070 | 1070 | int i; |
1071 | - struct list_head *list = (struct list_head *) hooks; | |
1071 | + struct list_head *list = &hooks->capable; | |
1072 | 1072 | |
1073 | - if (!probe_kernel_write(&list->next, list->next, sizeof(void *))) | |
1073 | + if (!probe_kernel_write(list, list, sizeof(void *))) | |
1074 | 1074 | return true; |
1075 | 1075 | for (i = 0; i < ARRAY_SIZE(akari_hooks); i++) { |
1076 | - const unsigned int idx = | |
1077 | - ((unsigned long) akari_hooks[i].head | |
1078 | - - (unsigned long) hooks) | |
1079 | - / sizeof(struct list_head); | |
1080 | - struct list_head *self = &list[idx]; | |
1081 | - struct list_head *prev = self->prev; | |
1076 | + struct list_head *head = akari_hooks[i].head; | |
1077 | + struct security_hook_list *shp; | |
1082 | 1078 | |
1083 | - if (!lsm_test_page_ro(&prev->next) || | |
1084 | - !lsm_test_page_ro(&self->prev)) | |
1079 | + if (!lsm_test_page_ro(&head->next) || | |
1080 | + !lsm_test_page_ro(&head->prev)) | |
1085 | 1081 | return false; |
1086 | - if (!list_empty(self) && | |
1087 | - !lsm_test_page_ro(&list_last_entry | |
1088 | - (self, struct security_hook_list, | |
1089 | - list)->hook)) | |
1090 | - return false; | |
1082 | + list_for_each_entry(shp, head, list) | |
1083 | + if (!lsm_test_page_ro(&shp->list.next) || | |
1084 | + !lsm_test_page_ro(&shp->list.prev)) | |
1085 | + return false; | |
1091 | 1086 | } |
1092 | 1087 | return true; |
1093 | 1088 | } |
@@ -1094,9 +1089,9 @@ | ||
1094 | 1089 | #else |
1095 | 1090 | static bool __init check_ro_pages(struct security_hook_heads *hooks) |
1096 | 1091 | { |
1097 | - return !probe_kernel_write(&((struct list_head *) hooks)->next, | |
1098 | - ((struct list_head *) hooks)->next, | |
1099 | - sizeof(void *)); | |
1092 | + struct list_head *list = &hooks->capable; | |
1093 | + | |
1094 | + return !probe_kernel_write(list, list, sizeof(void *)); | |
1100 | 1095 | } |
1101 | 1096 | #endif |
1102 | 1097 | #endif |