Fix bugs with syscall trace record data copies
authorBarret Rhoden <brho@cs.berkeley.edu>
Mon, 28 Sep 2015 20:50:49 +0000 (16:50 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 8 Oct 2015 14:29:57 +0000 (10:29 -0400)
openat()'s trace was using path_l, instead of the MIN of path_l and the
buffer size.  Whoops - you'd overflow the buffer and cause all sorts of
problems (and only when tracing!).

write()'s trace was using ret, which could be -1.  We want to capture
what was attempted to be written, regardless of failure.  That's 'len',
not ret.

There's also no reason to use memmove.  We know the buffer for the trace
is distinct from its input.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/src/syscall.c

index 6887f73..6ba6d33 100644 (file)
@@ -1326,7 +1326,7 @@ static intreg_t sys_read(struct proc *p, int fd, void *buf, size_t len)
 
        if ((ret > 0) && t) {
                t->datalen = MIN(sizeof(t->data), ret);
 
        if ((ret > 0) && t) {
                t->datalen = MIN(sizeof(t->data), ret);
-               memmove(t->data, buf, t->datalen);
+               memcpy(t->data, buf, t->datalen);
        }
 
        return ret;
        }
 
        return ret;
@@ -1355,8 +1355,8 @@ static intreg_t sys_write(struct proc *p, int fd, const void *buf, size_t len)
        }
 
        if (t) {
        }
 
        if (t) {
-               t->datalen = MIN(sizeof(t->data), ret);
-               memmove(t->data, buf, t->datalen);
+               t->datalen = MIN(sizeof(t->data), len);
+               memcpy(t->data, buf, t->datalen);
        }
        return ret;
 
        }
        return ret;
 
@@ -1384,7 +1384,7 @@ static intreg_t sys_openat(struct proc *p, int fromfd, const char *path,
                return -1;
        if (t) {
                t->datalen = MIN(sizeof(t->data), path_l);
                return -1;
        if (t) {
                t->datalen = MIN(sizeof(t->data), path_l);
-               memmove(t->data, t_path, path_l);
+               memcpy(t->data, t_path, t->datalen);
        }
        sysc_save_str("open %s at fd %d", t_path, fromfd);
        mode &= ~p->fs_env.umask;
        }
        sysc_save_str("open %s at fd %d", t_path, fromfd);
        mode &= ~p->fs_env.umask;