@@ -731,15 +731,23 @@ static long unifykey_unlocked_ioctl(struct file *file,
731731 unsigned int cmd ,
732732 unsigned long arg )
733733{
734+ void __user * argp = (void __user * )arg ;
735+
734736 switch (cmd ) {
735737 case KEYUNIFY_ATTACH :
736738 {
737- struct key_item_t * appitem ;
739+ struct key_item_t appitem ;
738740 char initvalue [KEY_UNIFY_NAME_LEN ];
739741 int ret ;
740742
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 );
743751 ret = key_unify_init (initvalue , KEY_UNIFY_NAME_LEN );
744752 if (ret < 0 ) {
745753 pr_err ("%s:%d,key unify init fail\n" ,
@@ -754,13 +762,20 @@ static long unifykey_unlocked_ioctl(struct file *file,
754762 unsigned int index , reallen ;
755763 unsigned int keypermit , keystate ;
756764 struct key_item_t * kkey ;
757- struct key_item_info_t * key_item_info ;
765+ struct key_item_info_t key_item_info ;
758766 char * keyname ;
759767 int ret ;
760768
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 ;
764779 if (strlen (keyname ))
765780 kkey = unifykey_find_item_by_name (keyname );
766781 else
@@ -780,10 +795,10 @@ static long unifykey_unlocked_ioctl(struct file *file,
780795 __func__ , __LINE__ );
781796 return - EFAULT ;
782797 }
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 ,
787802 kkey -> name , strlen (kkey -> name ));
788803 ret = key_unify_size (kkey -> name , & reallen );
789804 if (ret < 0 ) {
@@ -792,7 +807,15 @@ static long unifykey_unlocked_ioctl(struct file *file,
792807 return - EFAULT ;
793808 }
794809 /* 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+ }
796819
797820 return 0 ;
798821 }
0 commit comments