summaryrefslogtreecommitdiffstats
path: root/cpukit/posix/src/munmap.c
diff options
context:
space:
mode:
Diffstat (limited to 'cpukit/posix/src/munmap.c')
-rw-r--r--cpukit/posix/src/munmap.c14
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 ) {