cregit-Linux how code gets into the kernel

Release 4.14 mm/maccess.c

Directory: mm
/*
 * Access kernel memory without faulting.
 */
#include <linux/export.h>
#include <linux/mm.h>
#include <linux/uaccess.h>

/**
 * probe_kernel_read(): safely attempt to read from a location
 * @dst: pointer to the buffer that shall take the data
 * @src: address to read from
 * @size: size of the data chunk
 *
 * Safely read from address @src to the buffer at @dst.  If a kernel fault
 * happens, handle that and return -EFAULT.
 *
 * We ensure that the copy_from_user is executed in atomic context so that
 * do_page_fault() doesn't attempt to take mmap_sem.  This makes
 * probe_kernel_read() suitable for use within regions where the caller
 * already holds mmap_sem, or other locks which nest inside mmap_sem.
 */

long __weak probe_kernel_read(void *dst, const void *src, size_t size)
    __attribute__((alias("__probe_kernel_read")));


long __probe_kernel_read(void *dst, const void *src, size_t size) { long ret; mm_segment_t old_fs = get_fs(); set_fs(KERNEL_DS); pagefault_disable(); ret = __copy_from_user_inatomic(dst, (__force const void __user *)src, size); pagefault_enable(); set_fs(old_fs); return ret ? -EFAULT : 0; }

Contributors

PersonTokensPropCommitsCommitProp
Ingo Molnar3754.41%125.00%
Jason Wessel3044.12%250.00%
Steven Rostedt11.47%125.00%
Total68100.00%4100.00%

EXPORT_SYMBOL_GPL(probe_kernel_read); /** * probe_kernel_write(): safely attempt to write to a location * @dst: address to write to * @src: pointer to the data that shall be written * @size: size of the data chunk * * Safely write to address @dst from the buffer at @src. If a kernel fault * happens, handle that and return -EFAULT. */ long __weak probe_kernel_write(void *dst, const void *src, size_t size) __attribute__((alias("__probe_kernel_write")));
long __probe_kernel_write(void *dst, const void *src, size_t size) { long ret; mm_segment_t old_fs = get_fs(); set_fs(KERNEL_DS); pagefault_disable(); ret = __copy_to_user_inatomic((__force void __user *)dst, src, size); pagefault_enable(); set_fs(old_fs); return ret ? -EFAULT : 0; }

Contributors

PersonTokensPropCommitsCommitProp
Ingo Molnar3653.73%125.00%
Jason Wessel3044.78%250.00%
Steven Rostedt11.49%125.00%
Total67100.00%4100.00%

EXPORT_SYMBOL_GPL(probe_kernel_write); /** * strncpy_from_unsafe: - Copy a NUL terminated string from unsafe address. * @dst: Destination address, in kernel space. This buffer must be at * least @count bytes long. * @src: Unsafe address. * @count: Maximum number of bytes to copy, including the trailing NUL. * * Copies a NUL-terminated string from unsafe address to kernel buffer. * * On success, returns the length of the string INCLUDING the trailing NUL. * * If access fails, returns -EFAULT (some data may have been copied * and the trailing NUL added). * * If @count is smaller than the length of the string, copies @count-1 bytes, * sets the last byte of @dst buffer to NUL and returns @count. */
long strncpy_from_unsafe(char *dst, const void *unsafe_addr, long count) { mm_segment_t old_fs = get_fs(); const void *src = unsafe_addr; long ret; if (unlikely(count <= 0)) return 0; set_fs(KERNEL_DS); pagefault_disable(); do { ret = __get_user(*dst++, (const char __user __force *)src++); } while (dst[-1] && ret == 0 && src - unsafe_addr < count); dst[-1] = '\0'; pagefault_enable(); set_fs(old_fs); return ret ? -EFAULT : src - unsafe_addr; }

Contributors

PersonTokensPropCommitsCommitProp
Alexei Starovoitov11595.83%133.33%
Linus Torvalds32.50%133.33%
Rasmus Villemoes21.67%133.33%
Total120100.00%3100.00%


Overall Contributors

PersonTokensPropCommitsCommitProp
Ingo Molnar11936.73%19.09%
Alexei Starovoitov11635.80%19.09%
Jason Wessel7523.15%218.18%
Steven Rostedt41.23%19.09%
Linus Torvalds30.93%19.09%
Rasmus Villemoes20.62%19.09%
David Howells20.62%19.09%
Andrew Morton10.31%19.09%
Paul Gortmaker10.31%19.09%
Heiko Carstens10.31%19.09%
Total324100.00%11100.00%
Directory: mm
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.