diff options
author | Gregory Nutt <gnutt@nuttx.org> | 2015-01-22 06:51:31 -0600 |
---|---|---|
committer | Gregory Nutt <gnutt@nuttx.org> | 2015-01-22 06:51:31 -0600 |
commit | 2cae47a7c9bd3520b55ae62efa33b92526ba3e3f (patch) | |
tree | 5e4aefcbd615a2887344a8d8710ad7fd930f3741 | |
parent | 70243edc4a9811caf2c98334ad2a057efeab10f5 (diff) | |
download | nuttx-2cae47a7c9bd3520b55ae62efa33b92526ba3e3f.tar.gz nuttx-2cae47a7c9bd3520b55ae62efa33b92526ba3e3f.tar.bz2 nuttx-2cae47a7c9bd3520b55ae62efa33b92526ba3e3f.zip |
Networking: Correct the value returned by accept() in the case where net_lockingwait() is called. It was returning -1 and losing the errno value. Noted by Rony Xln
-rw-r--r-- | apps/netutils/telnetd/telnetd_daemon.c | 2 | ||||
-rw-r--r-- | nuttx/include/nuttx/net/net.h | 8 | ||||
-rw-r--r-- | nuttx/net/socket/accept.c | 30 | ||||
-rw-r--r-- | nuttx/net/utils/net_lock.c | 10 |
4 files changed, 40 insertions, 10 deletions
diff --git a/apps/netutils/telnetd/telnetd_daemon.c b/apps/netutils/telnetd/telnetd_daemon.c index b90ef3207..41ae7e195 100644 --- a/apps/netutils/telnetd/telnetd_daemon.c +++ b/apps/netutils/telnetd/telnetd_daemon.c @@ -108,7 +108,7 @@ static int telnetd_daemon(int argc, char *argv[]) #ifdef CONFIG_SCHED_HAVE_PARENT struct sigaction sa; sigset_t blockset; -#endif +#endif socklen_t addrlen; FAR char *devpath; pid_t pid; diff --git a/nuttx/include/nuttx/net/net.h b/nuttx/include/nuttx/net/net.h index 27a8e2148..2e3206de0 100644 --- a/nuttx/include/nuttx/net/net.h +++ b/nuttx/include/nuttx/net/net.h @@ -227,6 +227,14 @@ void net_unlock(net_lock_t flags); * Description: * Atomically wait for sem while temporarily releasing g_netlock. * + * Input Parameters: + * sem - A reference to the semaphore to be taken. + * + * Returned value: + * The returned value is the same as sem_wait(): Zero (OK) is returned + * on success; -1 (ERROR) is returned on a failure with the errno value + * set appropriately. + * ****************************************************************************/ #ifdef CONFIG_NET_NOINTS diff --git a/nuttx/net/socket/accept.c b/nuttx/net/socket/accept.c index f9ba0dc13..46622d318 100644 --- a/nuttx/net/socket/accept.c +++ b/nuttx/net/socket/accept.c @@ -301,6 +301,7 @@ int accept(int sockfd, FAR struct sockaddr *addr, FAR socklen_t *addrlen) { err = EBADF; } + goto errout; } @@ -431,12 +432,25 @@ int accept(int sockfd, FAR struct sockaddr *addr, FAR socklen_t *addrlen) conn->accept = accept_interrupt; /* Wait for the send to complete or an error to occur: NOTES: (1) - * net_lockedwait will also terminate if a signal is received, (2) interrupts - * may be disabled! They will be re-enabled while the task sleeps and - * automatically re-enabled when the task restarts. + * net_lockedwait will also terminate if a signal is received, (2) + * interrupts may be disabled! They will be re-enabled while the + * task sleeps and automatically re-enabled when the task restarts. */ ret = net_lockedwait(&state.acpt_sem); + if (ret < 0) + { + /* The value returned by net_lockedwait() the same as the value + * returned by sem_wait(): Zero (OK) is returned on success; -1 + * (ERROR) is returned on a failure with the errno value set + * appropriately. + * + * We have to preserve the errno value here because it may be + * altered by intervening operations. + */ + + err = get_errno(); + } /* Make sure that no further interrupts are processed */ @@ -449,7 +463,7 @@ int accept(int sockfd, FAR struct sockaddr *addr, FAR socklen_t *addrlen) psock->s_flags = _SS_SETSTATE(psock->s_flags, _SF_IDLE); - /* Check for a errors. Errors are signaled by negative errno values + /* Check for a errors. Errors are signalled by negative errno values * for the send length. */ @@ -459,13 +473,13 @@ int accept(int sockfd, FAR struct sockaddr *addr, FAR socklen_t *addrlen) goto errout_with_lock; } - /* If net_lockedwait failed, then we were probably reawakened by a signal. In - * this case, net_lockedwait will have set errno appropriately. + /* If net_lockedwait failed, then we were probably reawakened by a + * signal. In this case, logic above will have set 'err' to the + * ernno value returned by net_lockedwait(). */ if (ret < 0) { - err = -ret; goto errout_with_lock; } } @@ -493,7 +507,7 @@ errout_with_socket: sockfd_release(newfd); errout: - errno = err; + set_errno(err); return ERROR; } diff --git a/nuttx/net/utils/net_lock.c b/nuttx/net/utils/net_lock.c index e0446690a..a8ee355ab 100644 --- a/nuttx/net/utils/net_lock.c +++ b/nuttx/net/utils/net_lock.c @@ -1,7 +1,7 @@ /**************************************************************************** * net/utils/net_lock.c * - * Copyright (C) 2011-2012, 2014 Gregory Nutt. All rights reserved. + * Copyright (C) 2011-2012, 2014-2015 Gregory Nutt. All rights reserved. * Author: Gregory Nutt <gnutt@nuttx.org> * * Redistribution and use in source and binary forms, with or without @@ -178,6 +178,14 @@ void net_unlock(net_lock_t flags) * Description: * Atomically wait for sem while temporarily releasing g_netlock. * + * Input Parameters: + * sem - A reference to the semaphore to be taken. + * + * Returned value: + * The returned value is the same as sem_wait(): Zero (OK) is returned + * on success; -1 (ERROR) is returned on a failure with the errno value + * set appropriately. + * ****************************************************************************/ int net_lockedwait(sem_t *sem) |