is_user_rwaddr() now takes a length parameter
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 13 Jul 2011 19:35:13 +0000 (12:35 -0700)
committerKevin Klues <klueska@cs.berkeley.edu>
Thu, 3 Nov 2011 00:36:05 +0000 (17:36 -0700)
kern/include/umem.h
kern/src/event.c

index f5296f1..ce050a1 100644 (file)
@@ -10,8 +10,8 @@
 
 /* Is this a valid user pointer for read/write?  It doesn't care if the address
  * is paged out or even an unmapped region: simply if it is in part of the
- * address space that could be RW user */
-static inline bool is_user_rwaddr(void *addr);
+ * address space that could be RW user.  Will also check for len bytes. */
+static inline bool is_user_rwaddr(void *addr, size_t len);
 
 /* Can they use the area in the manner of perm? */
 void *user_mem_check(struct proc *p, const void *DANGEROUS va, size_t len,
@@ -46,7 +46,10 @@ bool uva_is_kva(struct proc *p, void *uva, void *kva);
 uintptr_t uva2kva(struct proc *p, void *uva);
 
 /* UWLIM is defined as virtual address below which a process can write */
-static inline bool is_user_rwaddr(void *addr)
+static inline bool is_user_rwaddr(void *addr, size_t len)
 {
-       return ((uintptr_t)addr < UWLIM) ? TRUE : FALSE;
+       if (((uintptr_t)addr < UWLIM) && ((uintptr_t)addr + len <= UWLIM))
+               return TRUE;
+       else
+               return FALSE;
 }
index c84c3cf..6469e92 100644 (file)
@@ -32,7 +32,7 @@ static void post_ev_msg(struct event_mbox *mbox, struct event_msg *msg,
 {
        printd("Sending event type %d\n", msg->ev_type);
        /* Sanity check */
-       if (is_user_rwaddr(mbox))
+       if (is_user_rwaddr(mbox, 0))    /* don't care about len here */
                assert(current);
        /* If they just want a bit (NOMSG), just set the bit */
        if (ev_flags & EVENT_NOMSG) {
@@ -67,7 +67,7 @@ void send_event(struct proc *p, struct event_queue *ev_q, struct event_msg *msg,
                warn("[kernel] Null ev_q - kernel code should check before sending!");
                return;
        }
-       if (!is_user_rwaddr(ev_q)) {
+       if (!is_user_rwaddr(ev_q, sizeof(struct event_queue))) {
                /* Ought to kill them, just warn for now */
                warn("[kernel] Illegal addr for ev_q");
                return;
@@ -113,7 +113,8 @@ void send_event(struct proc *p, struct event_queue *ev_q, struct event_msg *msg,
        vcore_mbox = get_proc_ev_mbox(p, vcoreid);
        /* Allows the mbox to be the right vcoreid mbox (a KVA in procdata), or any
         * other user RW location. */
-       if ((ev_mbox != vcore_mbox) && (!is_user_rwaddr(ev_mbox))) {
+       if ((ev_mbox != vcore_mbox) &&
+           (!is_user_rwaddr(ev_mbox, sizeof(struct event_mbox)))) {
                /* Ought to kill them, just warn for now */
                warn("[kernel] Illegal addr for ev_mbox");
                goto out;