8
8
#include <linux/sched.h>
9
9
#include <linux/uaccess.h>
10
10
#include <linux/version.h>
11
+ #include <linux/minmax.h>
11
12
12
13
#if LINUX_VERSION_CODE >= KERNEL_VERSION (5 , 6 , 0 )
13
14
#define HAVE_PROC_OPS
14
15
#endif
15
16
16
- #define PROCFS_MAX_SIZE 2048
17
+ #define PROCFS_MAX_SIZE 2048UL
17
18
#define PROCFS_ENTRY_FILENAME "buffer2k"
18
19
19
20
static struct proc_dir_entry * our_proc_file ;
@@ -23,30 +24,26 @@ static unsigned long procfs_buffer_size = 0;
23
24
static ssize_t procfs_read (struct file * filp , char __user * buffer ,
24
25
size_t length , loff_t * offset )
25
26
{
26
- static int finished = 0 ;
27
-
28
- if (finished ) {
27
+ if (* offset || procfs_buffer_size == 0 ) {
29
28
pr_debug ("procfs_read: END\n" );
30
- finished = 0 ;
29
+ * offset = 0 ;
31
30
return 0 ;
32
31
}
33
- finished = 1 ;
34
-
32
+ procfs_buffer_size = min (procfs_buffer_size , length );
35
33
if (copy_to_user (buffer , procfs_buffer , procfs_buffer_size ))
36
34
return - EFAULT ;
35
+ * offset += procfs_buffer_size ;
37
36
38
37
pr_debug ("procfs_read: read %lu bytes\n" , procfs_buffer_size );
39
38
return procfs_buffer_size ;
40
39
}
41
40
static ssize_t procfs_write (struct file * file , const char __user * buffer ,
42
41
size_t len , loff_t * off )
43
42
{
44
- if (len > PROCFS_MAX_SIZE )
45
- procfs_buffer_size = PROCFS_MAX_SIZE ;
46
- else
47
- procfs_buffer_size = len ;
43
+ procfs_buffer_size = min (PROCFS_MAX_SIZE , len );
48
44
if (copy_from_user (procfs_buffer , buffer , procfs_buffer_size ))
49
45
return - EFAULT ;
46
+ * off += procfs_buffer_size ;
50
47
51
48
pr_debug ("procfs_write: write %lu bytes\n" , procfs_buffer_size );
52
49
return procfs_buffer_size ;
0 commit comments