mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-28 11:18:45 +07:00
Merge branch 'topic/uaccess' into topic/uaccess-ppc
Merge the generic changes to add user_[read|write]_access_begin().
This commit is contained in:
commit
1f59cc3482
@ -2794,7 +2794,8 @@ i915_gem_execbuffer2_ioctl(struct drm_device *dev, void *data,
|
||||
* And this range already got effectively checked earlier
|
||||
* when we did the "copy_from_user()" above.
|
||||
*/
|
||||
if (!user_access_begin(user_exec_list, count * sizeof(*user_exec_list)))
|
||||
if (!user_write_access_begin(user_exec_list,
|
||||
count * sizeof(*user_exec_list)))
|
||||
goto end;
|
||||
|
||||
for (i = 0; i < args->buffer_count; i++) {
|
||||
@ -2808,7 +2809,7 @@ i915_gem_execbuffer2_ioctl(struct drm_device *dev, void *data,
|
||||
end_user);
|
||||
}
|
||||
end_user:
|
||||
user_access_end();
|
||||
user_write_access_end();
|
||||
end:;
|
||||
}
|
||||
|
||||
|
12
fs/readdir.c
12
fs/readdir.c
@ -242,7 +242,7 @@ static int filldir(struct dir_context *ctx, const char *name, int namlen,
|
||||
return -EINTR;
|
||||
dirent = buf->current_dir;
|
||||
prev = (void __user *) dirent - prev_reclen;
|
||||
if (!user_access_begin(prev, reclen + prev_reclen))
|
||||
if (!user_write_access_begin(prev, reclen + prev_reclen))
|
||||
goto efault;
|
||||
|
||||
/* This might be 'dirent->d_off', but if so it will get overwritten */
|
||||
@ -251,14 +251,14 @@ static int filldir(struct dir_context *ctx, const char *name, int namlen,
|
||||
unsafe_put_user(reclen, &dirent->d_reclen, efault_end);
|
||||
unsafe_put_user(d_type, (char __user *) dirent + reclen - 1, efault_end);
|
||||
unsafe_copy_dirent_name(dirent->d_name, name, namlen, efault_end);
|
||||
user_access_end();
|
||||
user_write_access_end();
|
||||
|
||||
buf->current_dir = (void __user *)dirent + reclen;
|
||||
buf->prev_reclen = reclen;
|
||||
buf->count -= reclen;
|
||||
return 0;
|
||||
efault_end:
|
||||
user_access_end();
|
||||
user_write_access_end();
|
||||
efault:
|
||||
buf->error = -EFAULT;
|
||||
return -EFAULT;
|
||||
@ -327,7 +327,7 @@ static int filldir64(struct dir_context *ctx, const char *name, int namlen,
|
||||
return -EINTR;
|
||||
dirent = buf->current_dir;
|
||||
prev = (void __user *)dirent - prev_reclen;
|
||||
if (!user_access_begin(prev, reclen + prev_reclen))
|
||||
if (!user_write_access_begin(prev, reclen + prev_reclen))
|
||||
goto efault;
|
||||
|
||||
/* This might be 'dirent->d_off', but if so it will get overwritten */
|
||||
@ -336,7 +336,7 @@ static int filldir64(struct dir_context *ctx, const char *name, int namlen,
|
||||
unsafe_put_user(reclen, &dirent->d_reclen, efault_end);
|
||||
unsafe_put_user(d_type, &dirent->d_type, efault_end);
|
||||
unsafe_copy_dirent_name(dirent->d_name, name, namlen, efault_end);
|
||||
user_access_end();
|
||||
user_write_access_end();
|
||||
|
||||
buf->prev_reclen = reclen;
|
||||
buf->current_dir = (void __user *)dirent + reclen;
|
||||
@ -344,7 +344,7 @@ static int filldir64(struct dir_context *ctx, const char *name, int namlen,
|
||||
return 0;
|
||||
|
||||
efault_end:
|
||||
user_access_end();
|
||||
user_write_access_end();
|
||||
efault:
|
||||
buf->error = -EFAULT;
|
||||
return -EFAULT;
|
||||
|
@ -378,6 +378,14 @@ extern long strnlen_unsafe_user(const void __user *unsafe_addr, long count);
|
||||
static inline unsigned long user_access_save(void) { return 0UL; }
|
||||
static inline void user_access_restore(unsigned long flags) { }
|
||||
#endif
|
||||
#ifndef user_write_access_begin
|
||||
#define user_write_access_begin user_access_begin
|
||||
#define user_write_access_end user_access_end
|
||||
#endif
|
||||
#ifndef user_read_access_begin
|
||||
#define user_read_access_begin user_access_begin
|
||||
#define user_read_access_end user_access_end
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_HARDENED_USERCOPY
|
||||
void usercopy_warn(const char *name, const char *detail, bool to_user,
|
||||
|
@ -199,7 +199,7 @@ 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 (!user_access_begin(umask, bitmap_size / 8))
|
||||
if (!user_read_access_begin(umask, bitmap_size / 8))
|
||||
return -EFAULT;
|
||||
|
||||
while (nr_compat_longs > 1) {
|
||||
@ -211,11 +211,11 @@ long compat_get_bitmap(unsigned long *mask, const compat_ulong_t __user *umask,
|
||||
}
|
||||
if (nr_compat_longs)
|
||||
unsafe_get_user(*mask, umask++, Efault);
|
||||
user_access_end();
|
||||
user_read_access_end();
|
||||
return 0;
|
||||
|
||||
Efault:
|
||||
user_access_end();
|
||||
user_read_access_end();
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
@ -228,7 +228,7 @@ 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 (!user_access_begin(umask, bitmap_size / 8))
|
||||
if (!user_write_access_begin(umask, bitmap_size / 8))
|
||||
return -EFAULT;
|
||||
|
||||
while (nr_compat_longs > 1) {
|
||||
@ -239,10 +239,10 @@ long compat_put_bitmap(compat_ulong_t __user *umask, unsigned long *mask,
|
||||
}
|
||||
if (nr_compat_longs)
|
||||
unsafe_put_user((compat_ulong_t)*mask, umask++, Efault);
|
||||
user_access_end();
|
||||
user_write_access_end();
|
||||
return 0;
|
||||
Efault:
|
||||
user_access_end();
|
||||
user_write_access_end();
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
|
@ -1557,7 +1557,7 @@ SYSCALL_DEFINE5(waitid, int, which, pid_t, upid, struct siginfo __user *,
|
||||
if (!infop)
|
||||
return err;
|
||||
|
||||
if (!user_access_begin(infop, sizeof(*infop)))
|
||||
if (!user_write_access_begin(infop, sizeof(*infop)))
|
||||
return -EFAULT;
|
||||
|
||||
unsafe_put_user(signo, &infop->si_signo, Efault);
|
||||
@ -1566,10 +1566,10 @@ SYSCALL_DEFINE5(waitid, int, which, pid_t, upid, struct siginfo __user *,
|
||||
unsafe_put_user(info.pid, &infop->si_pid, Efault);
|
||||
unsafe_put_user(info.uid, &infop->si_uid, Efault);
|
||||
unsafe_put_user(info.status, &infop->si_status, Efault);
|
||||
user_access_end();
|
||||
user_write_access_end();
|
||||
return err;
|
||||
Efault:
|
||||
user_access_end();
|
||||
user_write_access_end();
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
@ -1684,7 +1684,7 @@ COMPAT_SYSCALL_DEFINE5(waitid,
|
||||
if (!infop)
|
||||
return err;
|
||||
|
||||
if (!user_access_begin(infop, sizeof(*infop)))
|
||||
if (!user_write_access_begin(infop, sizeof(*infop)))
|
||||
return -EFAULT;
|
||||
|
||||
unsafe_put_user(signo, &infop->si_signo, Efault);
|
||||
@ -1693,10 +1693,10 @@ COMPAT_SYSCALL_DEFINE5(waitid,
|
||||
unsafe_put_user(info.pid, &infop->si_pid, Efault);
|
||||
unsafe_put_user(info.uid, &infop->si_uid, Efault);
|
||||
unsafe_put_user(info.status, &infop->si_status, Efault);
|
||||
user_access_end();
|
||||
user_write_access_end();
|
||||
return err;
|
||||
Efault:
|
||||
user_access_end();
|
||||
user_write_access_end();
|
||||
return -EFAULT;
|
||||
}
|
||||
#endif
|
||||
|
@ -116,9 +116,9 @@ long strncpy_from_user(char *dst, const char __user *src, long count)
|
||||
|
||||
kasan_check_write(dst, count);
|
||||
check_object_size(dst, count, false);
|
||||
if (user_access_begin(src, max)) {
|
||||
if (user_read_access_begin(src, max)) {
|
||||
retval = do_strncpy_from_user(dst, src, count, max);
|
||||
user_access_end();
|
||||
user_read_access_end();
|
||||
return retval;
|
||||
}
|
||||
}
|
||||
|
@ -109,9 +109,9 @@ long strnlen_user(const char __user *str, long count)
|
||||
if (max > count)
|
||||
max = count;
|
||||
|
||||
if (user_access_begin(str, max)) {
|
||||
if (user_read_access_begin(str, max)) {
|
||||
retval = do_strnlen_user(str, count, max);
|
||||
user_access_end();
|
||||
user_read_access_end();
|
||||
return retval;
|
||||
}
|
||||
}
|
||||
|
@ -58,7 +58,7 @@ int check_zeroed_user(const void __user *from, size_t size)
|
||||
from -= align;
|
||||
size += align;
|
||||
|
||||
if (!user_access_begin(from, size))
|
||||
if (!user_read_access_begin(from, size))
|
||||
return -EFAULT;
|
||||
|
||||
unsafe_get_user(val, (unsigned long __user *) from, err_fault);
|
||||
@ -79,10 +79,10 @@ int check_zeroed_user(const void __user *from, size_t size)
|
||||
val &= aligned_byte_mask(size);
|
||||
|
||||
done:
|
||||
user_access_end();
|
||||
user_read_access_end();
|
||||
return (val == 0);
|
||||
err_fault:
|
||||
user_access_end();
|
||||
user_read_access_end();
|
||||
return -EFAULT;
|
||||
}
|
||||
EXPORT_SYMBOL(check_zeroed_user);
|
||||
|
Loading…
Reference in New Issue
Block a user