summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnoop C S <anoopcs@redhat.com>2017-07-13 02:36:20 +0200
committerMichael Adam <obnox@samba.org>2017-07-27 14:16:09 +0200
commit070d84d733369a4de8f2b840a1f92065e2f3473d (patch)
tree21b908edda47cdcfff0a87476ff0bf5598350430
parentb585bf0a24d19e03f5a9fdc51b6b1bc90e60ddd6 (diff)
downloadsocket_wrapper-070d84d733369a4de8f2b840a1f92065e2f3473d.tar.gz
socket_wrapper-070d84d733369a4de8f2b840a1f92065e2f3473d.tar.xz
socket_wrapper-070d84d733369a4de8f2b840a1f92065e2f3473d.zip
swrap: Add common exit point to swrap_getsockopt
In preparation of thread safety. Signed-off-by: Anoop C S <anoopcs@redhat.com> Reviewed-by: Andreas Schneider <asn@samba.org> Reviewed-by: Michael Adam <obnox@samba.org>
-rw-r--r--src/socket_wrapper.c41
1 files changed, 27 insertions, 14 deletions
diff --git a/src/socket_wrapper.c b/src/socket_wrapper.c
index d4855b1..21e2fc1 100644
--- a/src/socket_wrapper.c
+++ b/src/socket_wrapper.c
@@ -3842,6 +3842,7 @@ static int swrap_getsockopt(int s, int level, int optname,
void *optval, socklen_t *optlen)
{
struct socket_info *si = find_socket_info(s);
+ int ret;
if (!si) {
return libc_getsockopt(s,
@@ -3858,12 +3859,14 @@ static int swrap_getsockopt(int s, int level, int optname,
if (optval == NULL || optlen == NULL ||
*optlen < (socklen_t)sizeof(int)) {
errno = EINVAL;
- return -1;
+ ret = -1;
+ goto done;
}
*optlen = sizeof(int);
*(int *)optval = si->family;
- return 0;
+ ret = 0;
+ goto done;
#endif /* SO_DOMAIN */
#ifdef SO_PROTOCOL
@@ -3871,29 +3874,34 @@ static int swrap_getsockopt(int s, int level, int optname,
if (optval == NULL || optlen == NULL ||
*optlen < (socklen_t)sizeof(int)) {
errno = EINVAL;
- return -1;
+ ret = -1;
+ goto done;
}
*optlen = sizeof(int);
*(int *)optval = si->protocol;
- return 0;
+ ret = 0;
+ goto done;
#endif /* SO_PROTOCOL */
case SO_TYPE:
if (optval == NULL || optlen == NULL ||
*optlen < (socklen_t)sizeof(int)) {
errno = EINVAL;
- return -1;
+ ret = -1;
+ goto done;
}
*optlen = sizeof(int);
*(int *)optval = si->type;
- return 0;
+ ret = 0;
+ goto done;
default:
- return libc_getsockopt(s,
- level,
- optname,
- optval,
- optlen);
+ ret = libc_getsockopt(s,
+ level,
+ optname,
+ optval,
+ optlen);
+ goto done;
}
} else if (level == IPPROTO_TCP) {
switch (optname) {
@@ -3907,13 +3915,15 @@ static int swrap_getsockopt(int s, int level, int optname,
if (optval == NULL || optlen == NULL ||
*optlen < (socklen_t)sizeof(int)) {
errno = EINVAL;
- return -1;
+ ret = -1;
+ goto done;
}
*optlen = sizeof(int);
*(int *)optval = si->tcp_nodelay;
- return 0;
+ ret = 0;
+ goto done;
#endif /* TCP_NODELAY */
default:
break;
@@ -3921,7 +3931,10 @@ static int swrap_getsockopt(int s, int level, int optname,
}
errno = ENOPROTOOPT;
- return -1;
+ ret = -1;
+
+done:
+ return ret;
}
#ifdef HAVE_ACCEPT_PSOCKLEN_T