summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
Diffstat (limited to 'sys')
-rw-r--r--sys/conf/BLACKLIST1
-rw-r--r--sys/fs/tmpfs.c8
-rw-r--r--sys/kern/kern_subr.c21
3 files changed, 26 insertions, 4 deletions
diff --git a/sys/conf/BLACKLIST b/sys/conf/BLACKLIST
deleted file mode 100644
index 4eb32d8..0000000
--- a/sys/conf/BLACKLIST
+++ /dev/null
@@ -1 +0,0 @@
-xhci ahci nvme
diff --git a/sys/fs/tmpfs.c b/sys/fs/tmpfs.c
index c3f2fae..4fd9e85 100644
--- a/sys/fs/tmpfs.c
+++ b/sys/fs/tmpfs.c
@@ -238,6 +238,7 @@ static int
tmpfs_write(struct vnode *vp, struct sio_txn *sio)
{
struct tmpfs_node *np;
+ off_t res_off;
uint8_t *buf;
if (sio->buf == NULL || sio->len == 0) {
@@ -274,8 +275,9 @@ tmpfs_write(struct vnode *vp, struct sio_txn *sio)
* Bring up the real size if we are writing
* more bytes.
*/
- if (sio->offset >= np->real_size) {
- np->real_size = sio->offset;
+ res_off = sio->offset + sio->len;
+ if (res_off > np->real_size) {
+ np->real_size = res_off;
}
/*
@@ -285,7 +287,7 @@ tmpfs_write(struct vnode *vp, struct sio_txn *sio)
* into a suitable size that does not overflow what we
* have left.
*/
- if ((sio->offset + sio->len) > np->len) {
+ if (res_off > np->len) {
np->data = dynrealloc(np->data, (sio->offset + sio->len));
if (np->data == NULL) {
sio->len = np->len;
diff --git a/sys/kern/kern_subr.c b/sys/kern/kern_subr.c
index f437ec7..8a08f33 100644
--- a/sys/kern/kern_subr.c
+++ b/sys/kern/kern_subr.c
@@ -29,9 +29,12 @@
#include <sys/proc.h>
#include <sys/types.h>
+#include <sys/param.h>
#include <sys/errno.h>
+#include <sys/mman.h>
#include <sys/exec.h>
#include <sys/systm.h>
+#include <vm/vm.h>
#include <string.h>
/*
@@ -45,6 +48,8 @@ static bool
check_uaddr(const void *uaddr)
{
vaddr_t stack_start, stack_end;
+ struct mmap_lgdr *lp;
+ struct mmap_entry find, *res;
struct exec_prog exec;
struct proc *td;
uintptr_t addr;
@@ -61,6 +66,22 @@ check_uaddr(const void *uaddr)
if (addr >= stack_start && addr <= stack_end)
return true;
+ /* Try to grab the mmap ledger */
+ if ((lp = td->mlgdr) == NULL) {
+ return false;
+ }
+
+ /*
+ * Now give an attempt at looking through the
+ * mmap ledger. Perhaps this memory was allocated
+ * in the user heap?
+ */
+ find.va_start = ALIGN_DOWN(addr, DEFAULT_PAGESIZE);
+ res = RBT_FIND(lgdr_entries, &lp->hd, &find);
+ if (res != NULL) {
+ return true;
+ }
+
return false;
}