Check safety of user pointer syscall arguments
authorBarret Rhoden <brho@cs.berkeley.edu>
Sat, 2 Mar 2019 00:43:19 +0000 (19:43 -0500)
committerBarret Rhoden <brho@cs.berkeley.edu>
Sat, 2 Mar 2019 00:50:19 +0000 (19:50 -0500)
commit27178190dd7ca99d3b64ee6d46e33bea5f80e4cb
tree2c3e21c4000939ad117be103f1c16226461ba161
parentcafc2613f8a65b5fe464e0fc70f41985b589e087
Check safety of user pointer syscall arguments

Most arguments, such as a path name, are copied into the kernel.
Buffers used in read() and write() are passed deeper into the kernel
as-is.  Later on, the devices are supposed to check the pointers, often
doing a safe operation such as copy_from_user().

fs_file_write() was doing that, however the assertion at the end of the
loop was failing.  If buf + count wrapped around, we'd skip the loop
entirely and trigger a panic.

For safety's sake, we ought to just check the range early on.  The
is_user_r{,w}addr() checks can handle wraparound as well as making sure
the region is safe.

There were a few other syscalls that didn't have checks or didn't have
errstrs for the message.  This commit fixes them all.

Reported-by: syzbot+7a8e2903ce1233ffcd3d@syzkaller.appspotmail.com
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/src/ns/fs_file.c
kern/src/syscall.c