summaryrefslogtreecommitdiffstats
path: root/c/src/libnetworking/rtems/rtems_syscall.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--c/src/libnetworking/rtems/rtems_syscall.c17
1 files changed, 10 insertions, 7 deletions
diff --git a/c/src/libnetworking/rtems/rtems_syscall.c b/c/src/libnetworking/rtems/rtems_syscall.c
index 05217f7212..d04ae95afb 100644
--- a/c/src/libnetworking/rtems/rtems_syscall.c
+++ b/c/src/libnetworking/rtems/rtems_syscall.c
@@ -136,11 +136,8 @@ connect (int s, struct sockaddr *name, int namelen)
return -1;
}
error = soconnect (so, nam);
- if (error) {
- errno = error;
- rtems_bsdnet_semaphore_release ();
- return -1;
- }
+ if (error)
+ goto bad;
if ((so->so_state & SS_NBIO) && (so->so_state & SS_ISCONNECTING)) {
m_freem(nam);
errno = EINPROGRESS;
@@ -148,15 +145,20 @@ connect (int s, struct sockaddr *name, int namelen)
return -1;
}
while ((so->so_state & SS_ISCONNECTING) && so->so_error == 0) {
- so->so_error = soconnsleep (so);
+ error = soconnsleep (so);
+ if (error)
+ break;
}
if (error == 0) {
error = so->so_error;
so->so_error = 0;
}
+ bad:
so->so_state &= ~SS_ISCONNECTING;
m_freem (nam);
- if (error == 0)
+ if (error)
+ errno = error;
+ else
ret = 0;
rtems_bsdnet_semaphore_release ();
return ret;
@@ -605,6 +607,7 @@ getpeersockname (int s, struct sockaddr *name, int *namelen, int pflag)
else
error = (*so->so_proto->pr_usrreqs->pru_sockaddr)(so, m);
if (error) {
+ m_freem(m);
errno = error;
rtems_bsdnet_semaphore_release ();
return -1;