diff options
Diffstat (limited to 'sys')
-rw-r--r-- | sys/conf/BLACKLIST | 1 | ||||
-rw-r--r-- | sys/fs/tmpfs.c | 8 | ||||
-rw-r--r-- | sys/kern/kern_subr.c | 21 |
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; } |