File tree Expand file tree Collapse file tree 1 file changed +46
-2
lines changed Expand file tree Collapse file tree 1 file changed +46
-2
lines changed Original file line number Diff line number Diff line change @@ -904,8 +904,52 @@ EXPORT_SYMBOL_GPL(debugfs_create_str);
904
904
static ssize_t debugfs_write_file_str (struct file * file , const char __user * user_buf ,
905
905
size_t count , loff_t * ppos )
906
906
{
907
- /* This is really only for read-only strings */
908
- return - EINVAL ;
907
+ struct dentry * dentry = F_DENTRY (file );
908
+ char * old , * new = NULL ;
909
+ int pos = * ppos ;
910
+ int r ;
911
+
912
+ r = debugfs_file_get (dentry );
913
+ if (unlikely (r ))
914
+ return r ;
915
+
916
+ old = * (char * * )file -> private_data ;
917
+
918
+ /* only allow strict concatenation */
919
+ r = - EINVAL ;
920
+ if (pos && pos != strlen (old ))
921
+ goto error ;
922
+
923
+ r = - E2BIG ;
924
+ if (pos + count + 1 > PAGE_SIZE )
925
+ goto error ;
926
+
927
+ r = - ENOMEM ;
928
+ new = kmalloc (pos + count + 1 , GFP_KERNEL );
929
+ if (!new )
930
+ goto error ;
931
+
932
+ if (pos )
933
+ memcpy (new , old , pos );
934
+
935
+ r = - EFAULT ;
936
+ if (copy_from_user (new + pos , user_buf , count ))
937
+ goto error ;
938
+
939
+ new [pos + count ] = '\0' ;
940
+ strim (new );
941
+
942
+ rcu_assign_pointer (* (char * * )file -> private_data , new );
943
+ synchronize_rcu ();
944
+ kfree (old );
945
+
946
+ debugfs_file_put (dentry );
947
+ return count ;
948
+
949
+ error :
950
+ kfree (new );
951
+ debugfs_file_put (dentry );
952
+ return r ;
909
953
}
910
954
911
955
static const struct file_operations fops_str = {
You can’t perform that action at this time.
0 commit comments