Check if member io_count is non-negative. If it is negative, the call to
vm_deallocate() will fail. Return KERN_INVALID_ARGUMENT in that case.
* device/chario.c (char_write): Check if member io_count is non-negative.
(char_write) (vm_deallocate) (io_count): Cast to vm_size_t.
---
device/chario.c | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/device/chario.c b/device/chario.c
index 8d68857..c9f946c 100644
--- a/device/chario.c
+++ b/device/chario.c
@@ -325,8 +325,12 @@ out:
simple_unlock(&tp->t_lock);
splx(s);
- if (!(ior->io_op & IO_INBAND))
- (void) vm_deallocate(device_io_map, addr, ior->io_count);
+ if (!(ior->io_op & IO_INBAND)) {
+ if (ior->io_count >= 0)
+ (void) vm_deallocate(device_io_map, addr,
(vm_size_t)ior->io_count);
+ else
+ return KERN_INVALID_ARGUMENT;
+ }
return rc;
}
--
1.8.1.4