summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAndreas Schneider <asn@cryptomilk.org>2014-05-14 17:44:07 +0200
committerMichael Adam <obnox@samba.org>2014-05-22 12:05:37 +0200
commit9b45102df0bf3dc817533d6e478fdf56852d2db5 (patch)
tree35b544946c63f9a6aadbf30239aba6a88b52e7ef /src
parentb02ecdf338ce6bcefaa91ec0a8fe3dce5b8925a8 (diff)
downloadsocket_wrapper-9b45102df0bf3dc817533d6e478fdf56852d2db5.tar.gz
socket_wrapper-9b45102df0bf3dc817533d6e478fdf56852d2db5.tar.xz
socket_wrapper-9b45102df0bf3dc817533d6e478fdf56852d2db5.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 'src')
-rw-r--r--src/socket_wrapper.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/src/socket_wrapper.c b/src/socket_wrapper.c
index 52fabf4..01a498f 100644
--- a/src/socket_wrapper.c
+++ b/src/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;