diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2015-01-15 14:13:19 +0100 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2015-01-20 07:11:58 +0100 |
commit | f87ede57a2e97f0743a85b94072c7163fa485ae9 (patch) | |
tree | 827af0350535dde1db7f1ae5d80226eb3a62533d /cpukit/libnetworking/rtems/rtems_select.c | |
parent | libnetworking: Delete dead code (diff) | |
download | rtems-f87ede57a2e97f0743a85b94072c7163fa485ae9.tar.bz2 |
libnetworking: Fix close of active sockets
Send a special event to notify tasks waiting for a socket state change
in case this socket gets closed. This prevents a use after free.
Close #785.
Diffstat (limited to 'cpukit/libnetworking/rtems/rtems_select.c')
-rw-r--r-- | cpukit/libnetworking/rtems/rtems_select.c | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/cpukit/libnetworking/rtems/rtems_select.c b/cpukit/libnetworking/rtems/rtems_select.c index 47a4cb2982..05c8951cd9 100644 --- a/cpukit/libnetworking/rtems/rtems_select.c +++ b/cpukit/libnetworking/rtems/rtems_select.c @@ -119,7 +119,8 @@ select (int nfds, fd_set *__restrict readfds, fd_set *__restrict writefds, int retval = 0; rtems_id tid; rtems_interval then = 0, now; - rtems_event_set events; + rtems_event_set in = SBWAIT_EVENT | RTEMS_EVENT_SYSTEM_NETWORK_CLOSE; + rtems_event_set out; if (nfds < 0) return (EINVAL); @@ -145,7 +146,7 @@ select (int nfds, fd_set *__restrict readfds, fd_set *__restrict writefds, #undef getbits rtems_task_ident (RTEMS_SELF, 0, &tid); - rtems_event_system_receive (SBWAIT_EVENT, RTEMS_EVENT_ANY | RTEMS_NO_WAIT, RTEMS_NO_TIMEOUT, &events); + rtems_event_system_receive (in, RTEMS_EVENT_ANY | RTEMS_NO_WAIT, RTEMS_NO_TIMEOUT, &out); for (;;) { rtems_bsdnet_semaphore_obtain (); error = selscan(tid, ibits, obits, nfds, &retval); @@ -159,7 +160,7 @@ select (int nfds, fd_set *__restrict readfds, fd_set *__restrict writefds, break; then = now; } - rtems_event_system_receive (SBWAIT_EVENT, RTEMS_EVENT_ANY | RTEMS_WAIT, timo, &events); + rtems_event_system_receive (in, RTEMS_EVENT_ANY | RTEMS_WAIT, timo, &out); } #define putbits(name,i) if (name) *name = ob[i] |