diff options
author | Andreas Schneider <asn@samba.org> | 2014-06-03 14:58:24 +0200 |
---|---|---|
committer | Michael Adam <obnox@samba.org> | 2014-06-05 23:57:10 +0200 |
commit | f288efcd78d45ac8fe0ead7c7960cfe60a909ed2 (patch) | |
tree | ceabefa6916cae07ae999a5875e5c2c6e4536c5d /lib/socket_wrapper | |
parent | 1df081058326afb655f2860439b7b8c23403423b (diff) | |
download | samba-f288efcd78d45ac8fe0ead7c7960cfe60a909ed2.tar.gz samba-f288efcd78d45ac8fe0ead7c7960cfe60a909ed2.tar.xz samba-f288efcd78d45ac8fe0ead7c7960cfe60a909ed2.zip |
swrap: Truncate the address if the buffer is to small.
Signed-off-by: Andreas Schneider <asn@cryptomilk.org>
Reviewed-by: Michael Adam <obnox@samba.org>
Diffstat (limited to 'lib/socket_wrapper')
-rw-r--r-- | lib/socket_wrapper/socket_wrapper.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/lib/socket_wrapper/socket_wrapper.c b/lib/socket_wrapper/socket_wrapper.c index 52fabf4eec4..01a498ffccd 100644 --- a/lib/socket_wrapper/socket_wrapper.c +++ b/lib/socket_wrapper/socket_wrapper.c @@ -2761,6 +2761,7 @@ int open(const char *pathname, int flags, ...) static int swrap_getpeername(int s, struct sockaddr *name, socklen_t *addrlen) { struct socket_info *si = find_socket_info(s); + socklen_t len; if (!si) { return libc_getpeername(s, name, addrlen); @@ -2772,7 +2773,12 @@ static int swrap_getpeername(int s, struct sockaddr *name, socklen_t *addrlen) return -1; } - memcpy(name, si->peername, si->peername_len); + len = MIN(*addrlen, si->peername_len); + if (len == 0) { + return 0; + } + + memcpy(name, si->peername, len); *addrlen = si->peername_len; return 0; @@ -2794,12 +2800,18 @@ int getpeername(int s, struct sockaddr *name, socklen_t *addrlen) static int swrap_getsockname(int s, struct sockaddr *name, socklen_t *addrlen) { struct socket_info *si = find_socket_info(s); + socklen_t len; if (!si) { return libc_getsockname(s, name, addrlen); } - memcpy(name, si->myname, si->myname_len); + len = MIN(*addrlen, si->myname_len); + if (len == 0) { + return 0; + } + + memcpy(name, si->myname, len); *addrlen = si->myname_len; return 0; |