count and offset are passed from user space and not checked, only
offset is capped to 40 bits, which can be used to read/write out of
bounds of the device.
Fixes: 6e3f26456009 (“vfio/platform: read and write support for the device fd”)
Cc: stable@vger.kernel.org
Reported-by: Mostafa Saleh <smostafa@google.com>
Reviewed-by: Eric Auger <eric.auger@redhat.com>
Reviewed-by: Mostafa Saleh <smostafa@google.com>
Tested-by: Mostafa Saleh <smostafa@google.com>
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
 {
        unsigned int done = 0;
 
+       if (off >= reg->size)
+               return -EINVAL;
+
+       count = min_t(size_t, count, reg->size - off);
+
        if (!reg->ioaddr) {
                reg->ioaddr =
                        ioremap(reg->addr, reg->size);
 {
        unsigned int done = 0;
 
+       if (off >= reg->size)
+               return -EINVAL;
+
+       count = min_t(size_t, count, reg->size - off);
+
        if (!reg->ioaddr) {
                reg->ioaddr =
                        ioremap(reg->addr, reg->size);