]> git.ipfire.org Git - people/arne_f/kernel.git/blobdiff - kernel/compat.c
iio:magnetometer:ak8975 Fix alignment and data leak issues.
[people/arne_f/kernel.git] / kernel / compat.c
index 6f0a0e723a0622a8876f9bfc81bbe08346db2ffd..45ae3ace49c294ae086869627cdf2bed7186bdd9 100644 (file)
@@ -34,6 +34,7 @@ int compat_get_timex(struct timex *txc, const struct compat_timex __user *utp)
 {
        struct compat_timex tx32;
 
+       memset(txc, 0, sizeof(struct timex));
        if (copy_from_user(&tx32, utp, sizeof(struct compat_timex)))
                return -EFAULT;
 
@@ -200,29 +201,6 @@ int compat_put_timespec(const struct timespec *ts, void __user *uts)
 }
 EXPORT_SYMBOL_GPL(compat_put_timespec);
 
-int compat_convert_timespec(struct timespec __user **kts,
-                           const void __user *cts)
-{
-       struct timespec ts;
-       struct timespec __user *uts;
-
-       if (!cts || COMPAT_USE_64BIT_TIME) {
-               *kts = (struct timespec __user *)cts;
-               return 0;
-       }
-
-       uts = compat_alloc_user_space(sizeof(ts));
-       if (!uts)
-               return -EFAULT;
-       if (compat_get_timespec(&ts, cts))
-               return -EFAULT;
-       if (copy_to_user(uts, &ts, sizeof(ts)))
-               return -EFAULT;
-
-       *kts = uts;
-       return 0;
-}
-
 int get_compat_itimerval(struct itimerval *o, const struct compat_itimerval __user *i)
 {
        struct compat_itimerval v32;
@@ -459,10 +437,9 @@ long compat_get_bitmap(unsigned long *mask, const compat_ulong_t __user *umask,
        bitmap_size = ALIGN(bitmap_size, BITS_PER_COMPAT_LONG);
        nr_compat_longs = BITS_TO_COMPAT_LONGS(bitmap_size);
 
-       if (!access_ok(VERIFY_READ, umask, bitmap_size / 8))
+       if (!user_access_begin(VERIFY_READ, umask, bitmap_size / 8))
                return -EFAULT;
 
-       user_access_begin();
        while (nr_compat_longs > 1) {
                compat_ulong_t l1, l2;
                unsafe_get_user(l1, umask++, Efault);
@@ -489,10 +466,9 @@ long compat_put_bitmap(compat_ulong_t __user *umask, unsigned long *mask,
        bitmap_size = ALIGN(bitmap_size, BITS_PER_COMPAT_LONG);
        nr_compat_longs = BITS_TO_COMPAT_LONGS(bitmap_size);
 
-       if (!access_ok(VERIFY_WRITE, umask, bitmap_size / 8))
+       if (!user_access_begin(VERIFY_WRITE, umask, bitmap_size / 8))
                return -EFAULT;
 
-       user_access_begin();
        while (nr_compat_longs > 1) {
                unsigned long m = *mask++;
                unsafe_put_user((compat_ulong_t)m, umask++, Efault);