summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/bio/bss_dgram.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/bio/bss_dgram.c')
-rw-r--r--src/lib/libcrypto/bio/bss_dgram.c91
1 files changed, 29 insertions, 62 deletions
diff --git a/src/lib/libcrypto/bio/bss_dgram.c b/src/lib/libcrypto/bio/bss_dgram.c
index 54c012c47d..1b1e4bec81 100644
--- a/src/lib/libcrypto/bio/bss_dgram.c
+++ b/src/lib/libcrypto/bio/bss_dgram.c
@@ -77,20 +77,10 @@
77#define OPENSSL_SCTP_FORWARD_CUM_TSN_CHUNK_TYPE 0xc0 77#define OPENSSL_SCTP_FORWARD_CUM_TSN_CHUNK_TYPE 0xc0
78#endif 78#endif
79 79
80#if defined(OPENSSL_SYS_LINUX) && !defined(IP_MTU) 80#ifdef OPENSSL_SYS_LINUX
81#define IP_MTU 14 /* linux is lame */ 81#define IP_MTU 14 /* linux is lame */
82#endif 82#endif
83 83
84#if defined(__FreeBSD__) && defined(IN6_IS_ADDR_V4MAPPED)
85/* Standard definition causes type-punning problems. */
86#undef IN6_IS_ADDR_V4MAPPED
87#define s6_addr32 __u6_addr.__u6_addr32
88#define IN6_IS_ADDR_V4MAPPED(a) \
89 (((a)->s6_addr32[0] == 0) && \
90 ((a)->s6_addr32[1] == 0) && \
91 ((a)->s6_addr32[2] == htonl(0x0000ffff)))
92#endif
93
94#ifdef WATT32 84#ifdef WATT32
95#define sock_write SockWrite /* Watt-32 uses same names */ 85#define sock_write SockWrite /* Watt-32 uses same names */
96#define sock_read SockRead 86#define sock_read SockRead
@@ -265,7 +255,7 @@ static void dgram_adjust_rcv_timeout(BIO *b)
265 { 255 {
266#if defined(SO_RCVTIMEO) 256#if defined(SO_RCVTIMEO)
267 bio_dgram_data *data = (bio_dgram_data *)b->ptr; 257 bio_dgram_data *data = (bio_dgram_data *)b->ptr;
268 union { size_t s; int i; } sz = {0}; 258 int sz = sizeof(int);
269 259
270 /* Is a timer active? */ 260 /* Is a timer active? */
271 if (data->next_timeout.tv_sec > 0 || data->next_timeout.tv_usec > 0) 261 if (data->next_timeout.tv_sec > 0 || data->next_timeout.tv_usec > 0)
@@ -275,10 +265,8 @@ static void dgram_adjust_rcv_timeout(BIO *b)
275 /* Read current socket timeout */ 265 /* Read current socket timeout */
276#ifdef OPENSSL_SYS_WINDOWS 266#ifdef OPENSSL_SYS_WINDOWS
277 int timeout; 267 int timeout;
278
279 sz.i = sizeof(timeout);
280 if (getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, 268 if (getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO,
281 (void*)&timeout, &sz.i) < 0) 269 (void*)&timeout, &sz) < 0)
282 { perror("getsockopt"); } 270 { perror("getsockopt"); }
283 else 271 else
284 { 272 {
@@ -286,12 +274,9 @@ static void dgram_adjust_rcv_timeout(BIO *b)
286 data->socket_timeout.tv_usec = (timeout % 1000) * 1000; 274 data->socket_timeout.tv_usec = (timeout % 1000) * 1000;
287 } 275 }
288#else 276#else
289 sz.i = sizeof(data->socket_timeout);
290 if ( getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, 277 if ( getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO,
291 &(data->socket_timeout), (void *)&sz) < 0) 278 &(data->socket_timeout), (void *)&sz) < 0)
292 { perror("getsockopt"); } 279 { perror("getsockopt"); }
293 else if (sizeof(sz.s)!=sizeof(sz.i) && sz.i==0)
294 OPENSSL_assert(sz.s<=sizeof(data->socket_timeout));
295#endif 280#endif
296 281
297 /* Get current time */ 282 /* Get current time */
@@ -460,10 +445,11 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
460 int *ip; 445 int *ip;
461 struct sockaddr *to = NULL; 446 struct sockaddr *to = NULL;
462 bio_dgram_data *data = NULL; 447 bio_dgram_data *data = NULL;
463#if defined(OPENSSL_SYS_LINUX) && (defined(IP_MTU_DISCOVER) || defined(IP_MTU)) 448#if defined(IP_MTU_DISCOVER) || defined(IP_MTU)
464 int sockopt_val = 0; 449 long sockopt_val = 0;
465 socklen_t sockopt_len; /* assume that system supporting IP_MTU is 450 unsigned int sockopt_len = 0;
466 * modern enough to define socklen_t */ 451#endif
452#ifdef OPENSSL_SYS_LINUX
467 socklen_t addr_len; 453 socklen_t addr_len;
468 union { 454 union {
469 struct sockaddr sa; 455 struct sockaddr sa;
@@ -545,7 +531,7 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
545 break; 531 break;
546 /* (Linux)kernel sets DF bit on outgoing IP packets */ 532 /* (Linux)kernel sets DF bit on outgoing IP packets */
547 case BIO_CTRL_DGRAM_MTU_DISCOVER: 533 case BIO_CTRL_DGRAM_MTU_DISCOVER:
548#if defined(OPENSSL_SYS_LINUX) && defined(IP_MTU_DISCOVER) && defined(IP_PMTUDISC_DO) 534#ifdef OPENSSL_SYS_LINUX
549 addr_len = (socklen_t)sizeof(addr); 535 addr_len = (socklen_t)sizeof(addr);
550 memset((void *)&addr, 0, sizeof(addr)); 536 memset((void *)&addr, 0, sizeof(addr));
551 if (getsockname(b->num, &addr.sa, &addr_len) < 0) 537 if (getsockname(b->num, &addr.sa, &addr_len) < 0)
@@ -553,6 +539,7 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
553 ret = 0; 539 ret = 0;
554 break; 540 break;
555 } 541 }
542 sockopt_len = sizeof(sockopt_val);
556 switch (addr.sa.sa_family) 543 switch (addr.sa.sa_family)
557 { 544 {
558 case AF_INET: 545 case AF_INET:
@@ -561,7 +548,7 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
561 &sockopt_val, sizeof(sockopt_val))) < 0) 548 &sockopt_val, sizeof(sockopt_val))) < 0)
562 perror("setsockopt"); 549 perror("setsockopt");
563 break; 550 break;
564#if OPENSSL_USE_IPV6 && defined(IPV6_MTU_DISCOVER) && defined(IPV6_PMTUDISC_DO) 551#if OPENSSL_USE_IPV6 && defined(IPV6_MTU_DISCOVER)
565 case AF_INET6: 552 case AF_INET6:
566 sockopt_val = IPV6_PMTUDISC_DO; 553 sockopt_val = IPV6_PMTUDISC_DO;
567 if ((ret = setsockopt(b->num, IPPROTO_IPV6, IPV6_MTU_DISCOVER, 554 if ((ret = setsockopt(b->num, IPPROTO_IPV6, IPV6_MTU_DISCOVER,
@@ -578,7 +565,7 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
578 break; 565 break;
579#endif 566#endif
580 case BIO_CTRL_DGRAM_QUERY_MTU: 567 case BIO_CTRL_DGRAM_QUERY_MTU:
581#if defined(OPENSSL_SYS_LINUX) && defined(IP_MTU) 568#ifdef OPENSSL_SYS_LINUX
582 addr_len = (socklen_t)sizeof(addr); 569 addr_len = (socklen_t)sizeof(addr);
583 memset((void *)&addr, 0, sizeof(addr)); 570 memset((void *)&addr, 0, sizeof(addr));
584 if (getsockname(b->num, &addr.sa, &addr_len) < 0) 571 if (getsockname(b->num, &addr.sa, &addr_len) < 0)
@@ -740,15 +727,12 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
740#endif 727#endif
741 break; 728 break;
742 case BIO_CTRL_DGRAM_GET_RECV_TIMEOUT: 729 case BIO_CTRL_DGRAM_GET_RECV_TIMEOUT:
743 {
744 union { size_t s; int i; } sz = {0};
745#ifdef OPENSSL_SYS_WINDOWS 730#ifdef OPENSSL_SYS_WINDOWS
746 int timeout; 731 {
732 int timeout, sz = sizeof(timeout);
747 struct timeval *tv = (struct timeval *)ptr; 733 struct timeval *tv = (struct timeval *)ptr;
748
749 sz.i = sizeof(timeout);
750 if (getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, 734 if (getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO,
751 (void*)&timeout, &sz.i) < 0) 735 (void*)&timeout, &sz) < 0)
752 { perror("getsockopt"); ret = -1; } 736 { perror("getsockopt"); ret = -1; }
753 else 737 else
754 { 738 {
@@ -756,20 +740,12 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
756 tv->tv_usec = (timeout % 1000) * 1000; 740 tv->tv_usec = (timeout % 1000) * 1000;
757 ret = sizeof(*tv); 741 ret = sizeof(*tv);
758 } 742 }
743 }
759#else 744#else
760 sz.i = sizeof(struct timeval);
761 if ( getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, 745 if ( getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO,
762 ptr, (void *)&sz) < 0) 746 ptr, (void *)&ret) < 0)
763 { perror("getsockopt"); ret = -1; } 747 { perror("getsockopt"); ret = -1; }
764 else if (sizeof(sz.s)!=sizeof(sz.i) && sz.i==0)
765 {
766 OPENSSL_assert(sz.s<=sizeof(struct timeval));
767 ret = (int)sz.s;
768 }
769 else
770 ret = sz.i;
771#endif 748#endif
772 }
773 break; 749 break;
774#endif 750#endif
775#if defined(SO_SNDTIMEO) 751#if defined(SO_SNDTIMEO)
@@ -789,15 +765,12 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
789#endif 765#endif
790 break; 766 break;
791 case BIO_CTRL_DGRAM_GET_SEND_TIMEOUT: 767 case BIO_CTRL_DGRAM_GET_SEND_TIMEOUT:
792 {
793 union { size_t s; int i; } sz = {0};
794#ifdef OPENSSL_SYS_WINDOWS 768#ifdef OPENSSL_SYS_WINDOWS
795 int timeout; 769 {
770 int timeout, sz = sizeof(timeout);
796 struct timeval *tv = (struct timeval *)ptr; 771 struct timeval *tv = (struct timeval *)ptr;
797
798 sz.i = sizeof(timeout);
799 if (getsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO, 772 if (getsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO,
800 (void*)&timeout, &sz.i) < 0) 773 (void*)&timeout, &sz) < 0)
801 { perror("getsockopt"); ret = -1; } 774 { perror("getsockopt"); ret = -1; }
802 else 775 else
803 { 776 {
@@ -805,20 +778,12 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
805 tv->tv_usec = (timeout % 1000) * 1000; 778 tv->tv_usec = (timeout % 1000) * 1000;
806 ret = sizeof(*tv); 779 ret = sizeof(*tv);
807 } 780 }
781 }
808#else 782#else
809 sz.i = sizeof(struct timeval);
810 if ( getsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO, 783 if ( getsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO,
811 ptr, (void *)&sz) < 0) 784 ptr, (void *)&ret) < 0)
812 { perror("getsockopt"); ret = -1; } 785 { perror("getsockopt"); ret = -1; }
813 else if (sizeof(sz.s)!=sizeof(sz.i) && sz.i==0)
814 {
815 OPENSSL_assert(sz.s<=sizeof(struct timeval));
816 ret = (int)sz.s;
817 }
818 else
819 ret = sz.i;
820#endif 786#endif
821 }
822 break; 787 break;
823#endif 788#endif
824 case BIO_CTRL_DGRAM_GET_SEND_TIMER_EXP: 789 case BIO_CTRL_DGRAM_GET_SEND_TIMER_EXP:
@@ -906,8 +871,8 @@ BIO *BIO_new_dgram_sctp(int fd, int close_flag)
906 memset(authchunks, 0, sizeof(sockopt_len)); 871 memset(authchunks, 0, sizeof(sockopt_len));
907 ret = getsockopt(fd, IPPROTO_SCTP, SCTP_LOCAL_AUTH_CHUNKS, authchunks, &sockopt_len); 872 ret = getsockopt(fd, IPPROTO_SCTP, SCTP_LOCAL_AUTH_CHUNKS, authchunks, &sockopt_len);
908 OPENSSL_assert(ret >= 0); 873 OPENSSL_assert(ret >= 0);
909 874
910 for (p = (unsigned char*) authchunks->gauth_chunks; 875 for (p = (unsigned char*) authchunks + sizeof(sctp_assoc_t);
911 p < (unsigned char*) authchunks + sockopt_len; 876 p < (unsigned char*) authchunks + sockopt_len;
912 p += sizeof(uint8_t)) 877 p += sizeof(uint8_t))
913 { 878 {
@@ -990,6 +955,7 @@ static int dgram_sctp_free(BIO *a)
990#ifdef SCTP_AUTHENTICATION_EVENT 955#ifdef SCTP_AUTHENTICATION_EVENT
991void dgram_sctp_handle_auth_free_key_event(BIO *b, union sctp_notification *snp) 956void dgram_sctp_handle_auth_free_key_event(BIO *b, union sctp_notification *snp)
992 { 957 {
958 unsigned int sockopt_len = 0;
993 int ret; 959 int ret;
994 struct sctp_authkey_event* authkeyevent = &snp->sn_auth_event; 960 struct sctp_authkey_event* authkeyevent = &snp->sn_auth_event;
995 961
@@ -999,8 +965,9 @@ void dgram_sctp_handle_auth_free_key_event(BIO *b, union sctp_notification *snp)
999 965
1000 /* delete key */ 966 /* delete key */
1001 authkeyid.scact_keynumber = authkeyevent->auth_keynumber; 967 authkeyid.scact_keynumber = authkeyevent->auth_keynumber;
968 sockopt_len = sizeof(struct sctp_authkeyid);
1002 ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_DELETE_KEY, 969 ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_DELETE_KEY,
1003 &authkeyid, sizeof(struct sctp_authkeyid)); 970 &authkeyid, sockopt_len);
1004 } 971 }
1005 } 972 }
1006#endif 973#endif
@@ -1197,7 +1164,7 @@ static int dgram_sctp_read(BIO *b, char *out, int outl)
1197 ii = getsockopt(b->num, IPPROTO_SCTP, SCTP_PEER_AUTH_CHUNKS, authchunks, &optlen); 1164 ii = getsockopt(b->num, IPPROTO_SCTP, SCTP_PEER_AUTH_CHUNKS, authchunks, &optlen);
1198 OPENSSL_assert(ii >= 0); 1165 OPENSSL_assert(ii >= 0);
1199 1166
1200 for (p = (unsigned char*) authchunks->gauth_chunks; 1167 for (p = (unsigned char*) authchunks + sizeof(sctp_assoc_t);
1201 p < (unsigned char*) authchunks + optlen; 1168 p < (unsigned char*) authchunks + optlen;
1202 p += sizeof(uint8_t)) 1169 p += sizeof(uint8_t))
1203 { 1170 {
@@ -1331,7 +1298,7 @@ static long dgram_sctp_ctrl(BIO *b, int cmd, long num, void *ptr)
1331 { 1298 {
1332 long ret=1; 1299 long ret=1;
1333 bio_dgram_sctp_data *data = NULL; 1300 bio_dgram_sctp_data *data = NULL;
1334 socklen_t sockopt_len = 0; 1301 unsigned int sockopt_len = 0;
1335 struct sctp_authkeyid authkeyid; 1302 struct sctp_authkeyid authkeyid;
1336 struct sctp_authkey *authkey; 1303 struct sctp_authkey *authkey;
1337 1304