1
2
3
4
5
6#include <linux/compiler.h>
7#include <linux/kernel.h>
8#include <linux/string.h>
9#include <linux/errno.h>
10#include <asm/uaccess.h>
11
12
13
14
15
16
17
18unsigned long copy_from_user_fixup(void *to, const void __user *from, unsigned long size)
19{
20 char *dst = to;
21 const char __user *src = from;
22
23 while (size--) {
24 if (__get_user(*dst, src))
25 break;
26 dst++;
27 src++;
28 }
29
30 if (size)
31 memset(dst, 0, size);
32
33 return size;
34}
35
36unsigned long copy_to_user_fixup(void __user *to, const void *from, unsigned long size)
37{
38 char __user *dst = to;
39 const char *src = from;
40
41 while (size--) {
42 if (__put_user(*src, dst))
43 break;
44 dst++;
45 src++;
46 }
47
48 return size;
49}
50
51unsigned long copy_in_user_fixup(void __user *to, void __user *from, unsigned long size)
52{
53 char __user *dst = to;
54 char __user *src = from;
55
56 while (size--) {
57 char tmp;
58
59 if (__get_user(tmp, src))
60 break;
61 if (__put_user(tmp, dst))
62 break;
63 dst++;
64 src++;
65 }
66
67 return size;
68}
69