]> rtime.felk.cvut.cz Git - lincan.git/blobdiff - lincan/src/read.c
Added checking of values returned by copy_to/from_user
[lincan.git] / lincan / src / read.c
index c16c76b5a723a1870f7fdf85c77b47b74fbf697f..a6f530573e1de1057fdf4f522bb84ae9a56f09e4 100644 (file)
@@ -54,19 +54,21 @@ ssize_t can_read(struct file *file, char *buffer, size_t length, loff_t *offset)
                }
        }
        
-       copy_to_user(buffer, &slot->msg, sizeof(struct canmsg_t));
+       ret = copy_to_user(buffer, &slot->msg, sizeof(struct canmsg_t));
        canque_free_outslot(qends, qedge, slot);
        buffer += sizeof(struct canmsg_t);
        bytes_to_copy = length-sizeof(struct canmsg_t);
+       if(ret) return -EFAULT;
        
        while (bytes_to_copy > 0) {
                ret=canque_test_outslot(qends, &qedge, &slot);
                if(ret<0)
                        break;
-               copy_to_user(buffer, &slot->msg, sizeof(struct canmsg_t));
+               ret = copy_to_user(buffer, &slot->msg, sizeof(struct canmsg_t));
                canque_free_outslot(qends, qedge, slot);
                buffer += sizeof(struct canmsg_t);
                bytes_to_copy -= sizeof(struct canmsg_t);
+               if(ret) return -EFAULT;
        }
 
        return length-bytes_to_copy;