brintos

brintos / linux-shallow public Read only

0
0
Text · 2.0 KiB · 27ec227 Raw
82 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2/*3 *4 * Copyright (c) 2014 Samsung Electronics Co., Ltd.5 * Author: Andrey Ryabinin <a.ryabinin@samsung.com>6 */7 8#define pr_fmt(fmt) "kasan: test: " fmt9 10#include <linux/mman.h>11#include <linux/module.h>12#include <linux/printk.h>13#include <linux/slab.h>14#include <linux/uaccess.h>15 16#include "kasan.h"17 18static noinline void __init copy_user_test(void)19{20	char *kmem;21	char __user *usermem;22	size_t size = 128 - KASAN_GRANULE_SIZE;23	int __maybe_unused unused;24 25	kmem = kmalloc(size, GFP_KERNEL);26	if (!kmem)27		return;28 29	usermem = (char __user *)vm_mmap(NULL, 0, PAGE_SIZE,30			    PROT_READ | PROT_WRITE | PROT_EXEC,31			    MAP_ANONYMOUS | MAP_PRIVATE, 0);32	if (IS_ERR(usermem)) {33		pr_err("Failed to allocate user memory\n");34		kfree(kmem);35		return;36	}37 38	OPTIMIZER_HIDE_VAR(size);39 40	pr_info("out-of-bounds in copy_from_user()\n");41	unused = copy_from_user(kmem, usermem, size + 1);42 43	pr_info("out-of-bounds in copy_to_user()\n");44	unused = copy_to_user(usermem, kmem, size + 1);45 46	pr_info("out-of-bounds in __copy_from_user()\n");47	unused = __copy_from_user(kmem, usermem, size + 1);48 49	pr_info("out-of-bounds in __copy_to_user()\n");50	unused = __copy_to_user(usermem, kmem, size + 1);51 52	pr_info("out-of-bounds in __copy_from_user_inatomic()\n");53	unused = __copy_from_user_inatomic(kmem, usermem, size + 1);54 55	pr_info("out-of-bounds in __copy_to_user_inatomic()\n");56	unused = __copy_to_user_inatomic(usermem, kmem, size + 1);57 58	pr_info("out-of-bounds in strncpy_from_user()\n");59	unused = strncpy_from_user(kmem, usermem, size + 1);60 61	vm_munmap((unsigned long)usermem, PAGE_SIZE);62	kfree(kmem);63}64 65static int __init kasan_test_module_init(void)66{67	/*68	 * Temporarily enable multi-shot mode. Otherwise, KASAN would only69	 * report the first detected bug and panic the kernel if panic_on_warn70	 * is enabled.71	 */72	bool multishot = kasan_save_enable_multi_shot();73 74	copy_user_test();75 76	kasan_restore_multi_shot(multishot);77	return -EAGAIN;78}79 80module_init(kasan_test_module_init);81MODULE_LICENSE("GPL");82