printk: check for user pointers in format string parameters
[akaros.git] / kern / src / syscall.c
index 9099d2c..4a886b6 100644 (file)
@@ -865,8 +865,13 @@ static int sys_proc_yield(struct proc *p, bool being_nice)
 }
 
 static int sys_change_vcore(struct proc *p, uint32_t vcoreid,
-                             bool enable_my_notif)
+                            bool enable_my_notif)
 {
+       if (!proc_vcoreid_is_safe(p, vcoreid)) {
+               set_error(EINVAL, "vcoreid %d out of range %d", vcoreid,
+                         p->procinfo->max_vcores);
+               return -1;
+       }
        /* Note retvals can be negative, but we don't mess with errno in case
         * callers use this in low-level code and want to extract the 'errno'.
         */
@@ -1456,6 +1461,11 @@ static int sys_self_notify(struct proc *p, uint32_t vcoreid,
                       ev_type, u_msg, u_msg ? u_msg->ev_type : 0);
                return -1;
        }
+       if (!proc_vcoreid_is_safe(p, vcoreid)) {
+               set_error(EINVAL, "vcoreid %d out of range %d", vcoreid,
+                         p->procinfo->max_vcores);
+               return -1;
+       }
        /* this will post a message and IPI, regardless of
         * wants/needs/debutantes.*/
        post_vcore_event(p, &local_msg, vcoreid,
@@ -1477,6 +1487,11 @@ static int sys_send_event(struct proc *p, struct event_queue *ev_q,
                set_error(EINVAL, "bad event_queue %p", ev_q);
                return -1;
        }
+       if (!proc_vcoreid_is_safe(p, vcoreid)) {
+               set_error(EINVAL, "vcoreid %d out of range %d", vcoreid,
+                         p->procinfo->max_vcores);
+               return -1;
+       }
        send_event(p, ev_q, &local_msg, vcoreid);
        return 0;
 }
@@ -2027,11 +2042,13 @@ intreg_t sys_readlink(struct proc *p, char *path, size_t path_l,
        ssize_t copy_amt;
        int ret = -1;
        char *t_path = copy_in_path(p, path, path_l);
-       struct dir *dir = NULL;
+       struct dir *dir;
 
        if (t_path == NULL)
                return -1;
        dir = sysdirlstat(t_path);
+       if (!dir)
+               return -1;
        if (!(dir->mode & DMSYMLINK))
                set_error(EINVAL, "not a symlink: %s", t_path);
        else