diff options
Diffstat (limited to 'cpukit/posix/src/munmap.c')
-rw-r--r-- | cpukit/posix/src/munmap.c | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/cpukit/posix/src/munmap.c b/cpukit/posix/src/munmap.c index 323a24e6f4..2d812ae041 100644 --- a/cpukit/posix/src/munmap.c +++ b/cpukit/posix/src/munmap.c @@ -46,6 +46,12 @@ int munmap(void *addr, size_t len) return -1; } + /* Check for illegal addresses. Watch out for address wrap. */ + if (addr + len < addr) { + errno = EINVAL; + return -1; + } + /* * Obtain the mmap lock. Sets errno on failure. */ @@ -63,9 +69,11 @@ int munmap(void *addr, size_t len) if ( mapping->is_shared_shm == true ) { shm_munmap(mapping->iop); } - refcnt = rtems_libio_decrement_mapping_refcnt(mapping->iop); - if ( refcnt == 0 ) { - rtems_libio_check_deferred_free(mapping->iop); + if ( mapping->iop != NULL ) { + refcnt = rtems_libio_decrement_mapping_refcnt(mapping->iop); + if ( refcnt == 0 ) { + rtems_libio_check_deferred_free(mapping->iop); + } } /* only free the mapping address for non-fixed mapping */ if (( mapping->flags & MAP_FIXED ) != MAP_FIXED ) { |