@@ -731,15 +731,23 @@ static long unifykey_unlocked_ioctl(struct file *file,
731
731
unsigned int cmd ,
732
732
unsigned long arg )
733
733
{
734
+ void __user * argp = (void __user * )arg ;
735
+
734
736
switch (cmd ) {
735
737
case KEYUNIFY_ATTACH :
736
738
{
737
- struct key_item_t * appitem ;
739
+ struct key_item_t appitem ;
738
740
char initvalue [KEY_UNIFY_NAME_LEN ];
739
741
int ret ;
740
742
741
- appitem = (struct key_item_t * )arg ;
742
- memcpy (initvalue , appitem -> name , KEY_UNIFY_NAME_LEN );
743
+ ret = copy_from_user (& appitem , argp , sizeof (appitem ));
744
+ if (ret != 0 ) {
745
+ pr_err ("%s:%d,copy_from_user fail\n" ,
746
+ __func__ , __LINE__ );
747
+ return ret ;
748
+ }
749
+ //appitem = (struct key_item_t *)arg;
750
+ memcpy (initvalue , appitem .name , KEY_UNIFY_NAME_LEN );
743
751
ret = key_unify_init (initvalue , KEY_UNIFY_NAME_LEN );
744
752
if (ret < 0 ) {
745
753
pr_err ("%s:%d,key unify init fail\n" ,
@@ -754,13 +762,20 @@ static long unifykey_unlocked_ioctl(struct file *file,
754
762
unsigned int index , reallen ;
755
763
unsigned int keypermit , keystate ;
756
764
struct key_item_t * kkey ;
757
- struct key_item_info_t * key_item_info ;
765
+ struct key_item_info_t key_item_info ;
758
766
char * keyname ;
759
767
int ret ;
760
768
761
- key_item_info = (struct key_item_info_t * )arg ;
762
- index = key_item_info -> id ;
763
- keyname = key_item_info -> name ;
769
+ ret = copy_from_user (& key_item_info ,
770
+ argp , sizeof (key_item_info ));
771
+ if (ret != 0 ) {
772
+ pr_err ("%s:%d,copy_from_user fail\n" ,
773
+ __func__ , __LINE__ );
774
+ return ret ;
775
+ }
776
+ //key_item_info = (struct key_item_info_t *)arg;
777
+ index = key_item_info .id ;
778
+ keyname = key_item_info .name ;
764
779
if (strlen (keyname ))
765
780
kkey = unifykey_find_item_by_name (keyname );
766
781
else
@@ -780,10 +795,10 @@ static long unifykey_unlocked_ioctl(struct file *file,
780
795
__func__ , __LINE__ );
781
796
return - EFAULT ;
782
797
}
783
- key_item_info -> permit = keypermit ;
784
- key_item_info -> flag = keystate ;
785
- key_item_info -> id = kkey -> id ;
786
- strncpy (key_item_info -> name ,
798
+ key_item_info . permit = keypermit ;
799
+ key_item_info . flag = keystate ;
800
+ key_item_info . id = kkey -> id ;
801
+ strncpy (key_item_info . name ,
787
802
kkey -> name , strlen (kkey -> name ));
788
803
ret = key_unify_size (kkey -> name , & reallen );
789
804
if (ret < 0 ) {
@@ -792,7 +807,15 @@ static long unifykey_unlocked_ioctl(struct file *file,
792
807
return - EFAULT ;
793
808
}
794
809
/* set key info */
795
- key_item_info -> size = reallen ;
810
+ key_item_info .size = reallen ;
811
+
812
+ ret = copy_to_user (argp ,
813
+ & key_item_info , sizeof (key_item_info ));
814
+ if (ret != 0 ) {
815
+ pr_err ("%s:%d,copy_to_user fail\n" ,
816
+ __func__ , __LINE__ );
817
+ return ret ;
818
+ }
796
819
797
820
return 0 ;
798
821
}
0 commit comments