diff options
author | Tom Yu <tlyu@mit.edu> | 2014-07-02 16:13:23 -0400 |
---|---|---|
committer | Tom Yu <tlyu@mit.edu> | 2014-07-02 17:04:37 -0400 |
commit | 158a551b14b017d232066c4a053dc608d87fa172 (patch) | |
tree | d946d4f56bf33b0a1cbd317fe54a42669e840802 | |
parent | 4bd50f73c80a86852ec0879abdf52202be40892b (diff) | |
download | krb5-158a551b14b017d232066c4a053dc608d87fa172.tar.gz krb5-158a551b14b017d232066c4a053dc608d87fa172.tar.xz krb5-158a551b14b017d232066c4a053dc608d87fa172.zip |
Fix bugs in bindresvport_sa() changes
In svctcp_create() and svcudp_bufcreate(), set sa->sa_len on platforms
where that field exists, so that a subsequent call to socklen() will
return the correct result.
To make the code more self-evidently correct, zero the entire struct
sockaddr_storage object, using the memset(&ss, 0, sizeof(ss)) idiom.
ticket: 7935
-rw-r--r-- | src/lib/rpc/svc_tcp.c | 5 | ||||
-rw-r--r-- | src/lib/rpc/svc_udp.c | 5 |
2 files changed, 8 insertions, 2 deletions
diff --git a/src/lib/rpc/svc_tcp.c b/src/lib/rpc/svc_tcp.c index 58f7b0e39..7b69c33da 100644 --- a/src/lib/rpc/svc_tcp.c +++ b/src/lib/rpc/svc_tcp.c @@ -159,8 +159,11 @@ svctcp_create( } set_cloexec_fd(sock); madesock = TRUE; - memset(sa, 0, sizeof(struct sockaddr_in)); + memset(&ss, 0, sizeof(ss)); sa->sa_family = AF_INET; +#ifdef HAVE_SA_LEN + sa->sa_len = sizeof(struct sockaddr_in); +#endif } else { len = sizeof(struct sockaddr_storage); if (getsockname(sock, sa, &len) != 0) { diff --git a/src/lib/rpc/svc_udp.c b/src/lib/rpc/svc_udp.c index 460472fe6..e9f1c3d00 100644 --- a/src/lib/rpc/svc_udp.c +++ b/src/lib/rpc/svc_udp.c @@ -130,8 +130,11 @@ svcudp_bufcreate( } set_cloexec_fd(sock); madesock = TRUE; - memset(sa, 0, sizeof(struct sockaddr_in)); + memset(&ss, 0, sizeof(ss)); sa->sa_family = AF_INET; +#ifdef HAVE_SA_LEN + sa->sa_len = sizeof(struct sockaddr_in); +#endif } else { len = sizeof(struct sockaddr_storage); if (getsockname(sock, sa, &len) < 0) { |