mirror of
https://github.com/crash-utility/crash
synced 2024-12-14 13:14:31 +00:00
Add a write operation handler to the sample /dev/crash memory driver
that enables writing to kernel memory via the "wr" command. (serapheim@delphix.com)
This commit is contained in:
parent
1baaafc0a4
commit
dfea9e3bd3
@ -3,6 +3,7 @@
|
|||||||
*
|
*
|
||||||
* Copyright (C) 2004, 2011, 2016 Dave Anderson <anderson@redhat.com>
|
* Copyright (C) 2004, 2011, 2016 Dave Anderson <anderson@redhat.com>
|
||||||
* Copyright (C) 2004, 2011, 2016 Red Hat, Inc.
|
* Copyright (C) 2004, 2011, 2016 Red Hat, Inc.
|
||||||
|
* Copyright (C) 2019 Serapheim Dimitropoulos <serapheim delphix com>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
@ -137,7 +138,7 @@ static inline void unmap_virtual(struct page *page)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#define CRASH_VERSION "1.3"
|
#define CRASH_VERSION "1.4"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* These are the file operation functions that allow crash utility
|
* These are the file operation functions that allow crash utility
|
||||||
@ -159,6 +160,43 @@ crash_llseek(struct file * file, loff_t offset, int orig)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static ssize_t
|
||||||
|
crash_write(struct file *file, const char *buf, size_t count, loff_t *poff)
|
||||||
|
{
|
||||||
|
void *vaddr;
|
||||||
|
struct page *page;
|
||||||
|
u64 offset;
|
||||||
|
ssize_t written;
|
||||||
|
char *buffer = file->private_data;
|
||||||
|
|
||||||
|
offset = *poff;
|
||||||
|
if (offset >> PAGE_SHIFT != (offset+count-1) >> PAGE_SHIFT)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
vaddr = map_virtual(offset, &page);
|
||||||
|
if (!vaddr)
|
||||||
|
return -EFAULT;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Use bounce buffer to bypass the CONFIG_HARDENED_USERCOPY
|
||||||
|
* kernel text restriction.
|
||||||
|
*/
|
||||||
|
if (copy_from_user(buffer, buf, count)) {
|
||||||
|
unmap_virtual(page);
|
||||||
|
return -EFAULT;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (probe_kernel_write(vaddr, buffer, count)) {
|
||||||
|
unmap_virtual(page);
|
||||||
|
return -EFAULT;
|
||||||
|
}
|
||||||
|
unmap_virtual(page);
|
||||||
|
|
||||||
|
written = count;
|
||||||
|
*poff += written;
|
||||||
|
return written;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Determine the page address for an address offset value,
|
* Determine the page address for an address offset value,
|
||||||
* get a virtual address for it, and copy it out.
|
* get a virtual address for it, and copy it out.
|
||||||
@ -256,6 +294,7 @@ static struct file_operations crash_fops = {
|
|||||||
.owner = THIS_MODULE,
|
.owner = THIS_MODULE,
|
||||||
.llseek = crash_llseek,
|
.llseek = crash_llseek,
|
||||||
.read = crash_read,
|
.read = crash_read,
|
||||||
|
.write = crash_write,
|
||||||
.unlocked_ioctl = crash_ioctl,
|
.unlocked_ioctl = crash_ioctl,
|
||||||
.open = crash_open,
|
.open = crash_open,
|
||||||
.release = crash_release,
|
.release = crash_release,
|
||||||
|
Loading…
Reference in New Issue
Block a user