diff options
| author | doug <> | 2015-01-03 18:07:29 +0000 |
|---|---|---|
| committer | doug <> | 2015-01-03 18:07:29 +0000 |
| commit | 919ac61b86380814cf1aa68d10ccb1b5bed747af (patch) | |
| tree | 1a682c1fdd2a7e05c5dde4ef08c70ba98577cbdd | |
| parent | 3a71bbcdc4f61edf763302e9f0114aa00ce81b97 (diff) | |
| download | openbsd-919ac61b86380814cf1aa68d10ccb1b5bed747af.tar.gz openbsd-919ac61b86380814cf1aa68d10ccb1b5bed747af.tar.bz2 openbsd-919ac61b86380814cf1aa68d10ccb1b5bed747af.zip | |
Fix incorrect OPENSSL_assert() usage.
Instead of asserting, return an error code for I/O errors. This is based
on OpenSSL commit 2521fcd8527008ceb3e4748f95b0ed4e2d70cfef. Added checks
for two calloc()s while I'm here.
ok miod@
Diffstat (limited to '')
| -rw-r--r-- | src/lib/libcrypto/bio/bss_dgram.c | 77 | ||||
| -rw-r--r-- | src/lib/libssl/src/crypto/bio/bss_dgram.c | 77 |
2 files changed, 106 insertions, 48 deletions
diff --git a/src/lib/libcrypto/bio/bss_dgram.c b/src/lib/libcrypto/bio/bss_dgram.c index 2e17dc9e21..c6b552eb32 100644 --- a/src/lib/libcrypto/bio/bss_dgram.c +++ b/src/lib/libcrypto/bio/bss_dgram.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: bss_dgram.c,v 1.37 2014/11/26 05:41:44 bcook Exp $ */ | 1 | /* $OpenBSD: bss_dgram.c,v 1.38 2015/01/03 18:07:29 doug Exp $ */ |
| 2 | /* | 2 | /* |
| 3 | * DTLS implementation written by Nagendra Modadugu | 3 | * DTLS implementation written by Nagendra Modadugu |
| 4 | * (nagendra@cs.stanford.edu) for the OpenSSL project 2005. | 4 | * (nagendra@cs.stanford.edu) for the OpenSSL project 2005. |
| @@ -719,18 +719,25 @@ BIO_new_dgram_sctp(int fd, int close_flag) | |||
| 719 | /* Activate SCTP-AUTH for DATA and FORWARD-TSN chunks */ | 719 | /* Activate SCTP-AUTH for DATA and FORWARD-TSN chunks */ |
| 720 | auth.sauth_chunk = OPENSSL_SCTP_DATA_CHUNK_TYPE; | 720 | auth.sauth_chunk = OPENSSL_SCTP_DATA_CHUNK_TYPE; |
| 721 | ret = setsockopt(fd, IPPROTO_SCTP, SCTP_AUTH_CHUNK, &auth, sizeof(struct sctp_authchunk)); | 721 | ret = setsockopt(fd, IPPROTO_SCTP, SCTP_AUTH_CHUNK, &auth, sizeof(struct sctp_authchunk)); |
| 722 | OPENSSL_assert(ret >= 0); | 722 | if (ret < 0) |
| 723 | goto err; | ||
| 723 | auth.sauth_chunk = OPENSSL_SCTP_FORWARD_CUM_TSN_CHUNK_TYPE; | 724 | auth.sauth_chunk = OPENSSL_SCTP_FORWARD_CUM_TSN_CHUNK_TYPE; |
| 724 | ret = setsockopt(fd, IPPROTO_SCTP, SCTP_AUTH_CHUNK, &auth, sizeof(struct sctp_authchunk)); | 725 | ret = setsockopt(fd, IPPROTO_SCTP, SCTP_AUTH_CHUNK, &auth, sizeof(struct sctp_authchunk)); |
| 725 | OPENSSL_assert(ret >= 0); | 726 | if (ret < 0) |
| 727 | goto err; | ||
| 726 | 728 | ||
| 727 | /* Test if activation was successful. When using accept(), | 729 | /* Test if activation was successful. When using accept(), |
| 728 | * SCTP-AUTH has to be activated for the listening socket | 730 | * SCTP-AUTH has to be activated for the listening socket |
| 729 | * already, otherwise the connected socket won't use it. */ | 731 | * already, otherwise the connected socket won't use it. */ |
| 730 | sockopt_len = (socklen_t)(sizeof(sctp_assoc_t) + 256 * sizeof(uint8_t)); | 732 | sockopt_len = (socklen_t)(sizeof(sctp_assoc_t) + 256 * sizeof(uint8_t)); |
| 731 | authchunks = calloc(1, sockopt_len); | 733 | authchunks = calloc(1, sockopt_len); |
| 734 | if (authchunks == NULL) | ||
| 735 | goto err; | ||
| 732 | ret = getsockopt(fd, IPPROTO_SCTP, SCTP_LOCAL_AUTH_CHUNKS, authchunks, &sockopt_len); | 736 | ret = getsockopt(fd, IPPROTO_SCTP, SCTP_LOCAL_AUTH_CHUNKS, authchunks, &sockopt_len); |
| 733 | OPENSSL_assert(ret >= 0); | 737 | if (ret < 0) { |
| 738 | free(authchunks); | ||
| 739 | goto err; | ||
| 740 | } | ||
| 734 | 741 | ||
| 735 | for (p = (unsigned char*) authchunks->gauth_chunks; | 742 | for (p = (unsigned char*) authchunks->gauth_chunks; |
| 736 | p < (unsigned char*) authchunks + sockopt_len; | 743 | p < (unsigned char*) authchunks + sockopt_len; |
| @@ -753,16 +760,19 @@ BIO_new_dgram_sctp(int fd, int close_flag) | |||
| 753 | event.se_type = SCTP_AUTHENTICATION_EVENT; | 760 | event.se_type = SCTP_AUTHENTICATION_EVENT; |
| 754 | event.se_on = 1; | 761 | event.se_on = 1; |
| 755 | ret = setsockopt(fd, IPPROTO_SCTP, SCTP_EVENT, &event, sizeof(struct sctp_event)); | 762 | ret = setsockopt(fd, IPPROTO_SCTP, SCTP_EVENT, &event, sizeof(struct sctp_event)); |
| 756 | OPENSSL_assert(ret >= 0); | 763 | if (ret < 0) |
| 764 | goto err; | ||
| 757 | #else | 765 | #else |
| 758 | sockopt_len = (socklen_t) sizeof(struct sctp_event_subscribe); | 766 | sockopt_len = (socklen_t) sizeof(struct sctp_event_subscribe); |
| 759 | ret = getsockopt(fd, IPPROTO_SCTP, SCTP_EVENTS, &event, &sockopt_len); | 767 | ret = getsockopt(fd, IPPROTO_SCTP, SCTP_EVENTS, &event, &sockopt_len); |
| 760 | OPENSSL_assert(ret >= 0); | 768 | if (ret < 0) |
| 769 | goto err; | ||
| 761 | 770 | ||
| 762 | event.sctp_authentication_event = 1; | 771 | event.sctp_authentication_event = 1; |
| 763 | 772 | ||
| 764 | ret = setsockopt(fd, IPPROTO_SCTP, SCTP_EVENTS, &event, sizeof(struct sctp_event_subscribe)); | 773 | ret = setsockopt(fd, IPPROTO_SCTP, SCTP_EVENTS, &event, sizeof(struct sctp_event_subscribe)); |
| 765 | OPENSSL_assert(ret >= 0); | 774 | if (ret < 0) |
| 775 | goto err; | ||
| 766 | #endif | 776 | #endif |
| 767 | #endif | 777 | #endif |
| 768 | 778 | ||
| @@ -770,9 +780,14 @@ BIO_new_dgram_sctp(int fd, int close_flag) | |||
| 770 | * larger than the max record size of 2^14 + 2048 + 13 | 780 | * larger than the max record size of 2^14 + 2048 + 13 |
| 771 | */ | 781 | */ |
| 772 | ret = setsockopt(fd, IPPROTO_SCTP, SCTP_PARTIAL_DELIVERY_POINT, &optval, sizeof(optval)); | 782 | ret = setsockopt(fd, IPPROTO_SCTP, SCTP_PARTIAL_DELIVERY_POINT, &optval, sizeof(optval)); |
| 773 | OPENSSL_assert(ret >= 0); | 783 | if (ret < 0) |
| 784 | goto err; | ||
| 774 | 785 | ||
| 775 | return (bio); | 786 | return (bio); |
| 787 | |||
| 788 | err: | ||
| 789 | BIO_vfree(bio); | ||
| 790 | return (NULL); | ||
| 776 | } | 791 | } |
| 777 | 792 | ||
| 778 | int | 793 | int |
| @@ -929,16 +944,25 @@ dgram_sctp_read(BIO *b, char *out, int outl) | |||
| 929 | event.se_type = SCTP_SENDER_DRY_EVENT; | 944 | event.se_type = SCTP_SENDER_DRY_EVENT; |
| 930 | event.se_on = 0; | 945 | event.se_on = 0; |
| 931 | i = setsockopt(b->num, IPPROTO_SCTP, SCTP_EVENT, &event, sizeof(struct sctp_event)); | 946 | i = setsockopt(b->num, IPPROTO_SCTP, SCTP_EVENT, &event, sizeof(struct sctp_event)); |
| 932 | OPENSSL_assert(i >= 0); | 947 | if (i < 0) { |
| 948 | ret = i; | ||
| 949 | break; | ||
| 950 | } | ||
| 933 | #else | 951 | #else |
| 934 | eventsize = sizeof(struct sctp_event_subscribe); | 952 | eventsize = sizeof(struct sctp_event_subscribe); |
| 935 | i = getsockopt(b->num, IPPROTO_SCTP, SCTP_EVENTS, &event, &eventsize); | 953 | i = getsockopt(b->num, IPPROTO_SCTP, SCTP_EVENTS, &event, &eventsize); |
| 936 | OPENSSL_assert(i >= 0); | 954 | if (i < 0) { |
| 955 | ret = i; | ||
| 956 | break; | ||
| 957 | } | ||
| 937 | 958 | ||
| 938 | event.sctp_sender_dry_event = 0; | 959 | event.sctp_sender_dry_event = 0; |
| 939 | 960 | ||
| 940 | i = setsockopt(b->num, IPPROTO_SCTP, SCTP_EVENTS, &event, sizeof(struct sctp_event_subscribe)); | 961 | i = setsockopt(b->num, IPPROTO_SCTP, SCTP_EVENTS, &event, sizeof(struct sctp_event_subscribe)); |
| 941 | OPENSSL_assert(i >= 0); | 962 | if (i < 0) { |
| 963 | ret = i; | ||
| 964 | break; | ||
| 965 | } | ||
| 942 | #endif | 966 | #endif |
| 943 | } | 967 | } |
| 944 | 968 | ||
| @@ -969,8 +993,8 @@ dgram_sctp_read(BIO *b, char *out, int outl) | |||
| 969 | */ | 993 | */ |
| 970 | optlen = (socklen_t) sizeof(int); | 994 | optlen = (socklen_t) sizeof(int); |
| 971 | ret = getsockopt(b->num, SOL_SOCKET, SO_RCVBUF, &optval, &optlen); | 995 | ret = getsockopt(b->num, SOL_SOCKET, SO_RCVBUF, &optval, &optlen); |
| 972 | OPENSSL_assert(ret >= 0); | 996 | if (ret >= 0) |
| 973 | OPENSSL_assert(optval >= 18445); | 997 | OPENSSL_assert(optval >= 18445); |
| 974 | 998 | ||
| 975 | /* Test if SCTP doesn't partially deliver below | 999 | /* Test if SCTP doesn't partially deliver below |
| 976 | * max record size (2^14 + 2048 + 13) | 1000 | * max record size (2^14 + 2048 + 13) |
| @@ -978,8 +1002,8 @@ dgram_sctp_read(BIO *b, char *out, int outl) | |||
| 978 | optlen = (socklen_t) sizeof(int); | 1002 | optlen = (socklen_t) sizeof(int); |
| 979 | ret = getsockopt(b->num, IPPROTO_SCTP, | 1003 | ret = getsockopt(b->num, IPPROTO_SCTP, |
| 980 | SCTP_PARTIAL_DELIVERY_POINT, &optval, &optlen); | 1004 | SCTP_PARTIAL_DELIVERY_POINT, &optval, &optlen); |
| 981 | OPENSSL_assert(ret >= 0); | 1005 | if (ret >= 0) |
| 982 | OPENSSL_assert(optval >= 18445); | 1006 | OPENSSL_assert(optval >= 18445); |
| 983 | 1007 | ||
| 984 | /* Partially delivered notification??? Probably a bug.... */ | 1008 | /* Partially delivered notification??? Probably a bug.... */ |
| 985 | OPENSSL_assert(!(msg.msg_flags & MSG_NOTIFICATION)); | 1009 | OPENSSL_assert(!(msg.msg_flags & MSG_NOTIFICATION)); |
| @@ -1008,16 +1032,21 @@ dgram_sctp_read(BIO *b, char *out, int outl) | |||
| 1008 | 1032 | ||
| 1009 | optlen = (socklen_t)(sizeof(sctp_assoc_t) + 256 * sizeof(uint8_t)); | 1033 | optlen = (socklen_t)(sizeof(sctp_assoc_t) + 256 * sizeof(uint8_t)); |
| 1010 | authchunks = calloc(1, optlen); | 1034 | authchunks = calloc(1, optlen); |
| 1035 | if (authchunks == NULL) { | ||
| 1036 | BIOerr(BIO_F_DGRAM_SCTP_READ, | ||
| 1037 | ERR_R_MALLOC_ERROR); | ||
| 1038 | return (-1); | ||
| 1039 | } | ||
| 1011 | ii = getsockopt(b->num, IPPROTO_SCTP, SCTP_PEER_AUTH_CHUNKS, authchunks, &optlen); | 1040 | ii = getsockopt(b->num, IPPROTO_SCTP, SCTP_PEER_AUTH_CHUNKS, authchunks, &optlen); |
| 1012 | OPENSSL_assert(ii >= 0); | 1041 | if (ii >= 0) { |
| 1013 | 1042 | for (p = (unsigned char*) authchunks->gauth_chunks; | |
| 1014 | for (p = (unsigned char*) authchunks->gauth_chunks; | 1043 | p < (unsigned char*) authchunks + optlen; |
| 1015 | p < (unsigned char*) authchunks + optlen; | 1044 | p += sizeof(uint8_t)) { |
| 1016 | p += sizeof(uint8_t)) { | 1045 | if (*p == OPENSSL_SCTP_DATA_CHUNK_TYPE) |
| 1017 | if (*p == OPENSSL_SCTP_DATA_CHUNK_TYPE) | 1046 | auth_data = 1; |
| 1018 | auth_data = 1; | 1047 | if (*p == OPENSSL_SCTP_FORWARD_CUM_TSN_CHUNK_TYPE) |
| 1019 | if (*p == OPENSSL_SCTP_FORWARD_CUM_TSN_CHUNK_TYPE) | 1048 | auth_forward = 1; |
| 1020 | auth_forward = 1; | 1049 | } |
| 1021 | } | 1050 | } |
| 1022 | 1051 | ||
| 1023 | free(authchunks); | 1052 | free(authchunks); |
diff --git a/src/lib/libssl/src/crypto/bio/bss_dgram.c b/src/lib/libssl/src/crypto/bio/bss_dgram.c index 2e17dc9e21..c6b552eb32 100644 --- a/src/lib/libssl/src/crypto/bio/bss_dgram.c +++ b/src/lib/libssl/src/crypto/bio/bss_dgram.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: bss_dgram.c,v 1.37 2014/11/26 05:41:44 bcook Exp $ */ | 1 | /* $OpenBSD: bss_dgram.c,v 1.38 2015/01/03 18:07:29 doug Exp $ */ |
| 2 | /* | 2 | /* |
| 3 | * DTLS implementation written by Nagendra Modadugu | 3 | * DTLS implementation written by Nagendra Modadugu |
| 4 | * (nagendra@cs.stanford.edu) for the OpenSSL project 2005. | 4 | * (nagendra@cs.stanford.edu) for the OpenSSL project 2005. |
| @@ -719,18 +719,25 @@ BIO_new_dgram_sctp(int fd, int close_flag) | |||
| 719 | /* Activate SCTP-AUTH for DATA and FORWARD-TSN chunks */ | 719 | /* Activate SCTP-AUTH for DATA and FORWARD-TSN chunks */ |
| 720 | auth.sauth_chunk = OPENSSL_SCTP_DATA_CHUNK_TYPE; | 720 | auth.sauth_chunk = OPENSSL_SCTP_DATA_CHUNK_TYPE; |
| 721 | ret = setsockopt(fd, IPPROTO_SCTP, SCTP_AUTH_CHUNK, &auth, sizeof(struct sctp_authchunk)); | 721 | ret = setsockopt(fd, IPPROTO_SCTP, SCTP_AUTH_CHUNK, &auth, sizeof(struct sctp_authchunk)); |
| 722 | OPENSSL_assert(ret >= 0); | 722 | if (ret < 0) |
| 723 | goto err; | ||
| 723 | auth.sauth_chunk = OPENSSL_SCTP_FORWARD_CUM_TSN_CHUNK_TYPE; | 724 | auth.sauth_chunk = OPENSSL_SCTP_FORWARD_CUM_TSN_CHUNK_TYPE; |
| 724 | ret = setsockopt(fd, IPPROTO_SCTP, SCTP_AUTH_CHUNK, &auth, sizeof(struct sctp_authchunk)); | 725 | ret = setsockopt(fd, IPPROTO_SCTP, SCTP_AUTH_CHUNK, &auth, sizeof(struct sctp_authchunk)); |
| 725 | OPENSSL_assert(ret >= 0); | 726 | if (ret < 0) |
| 727 | goto err; | ||
| 726 | 728 | ||
| 727 | /* Test if activation was successful. When using accept(), | 729 | /* Test if activation was successful. When using accept(), |
| 728 | * SCTP-AUTH has to be activated for the listening socket | 730 | * SCTP-AUTH has to be activated for the listening socket |
| 729 | * already, otherwise the connected socket won't use it. */ | 731 | * already, otherwise the connected socket won't use it. */ |
| 730 | sockopt_len = (socklen_t)(sizeof(sctp_assoc_t) + 256 * sizeof(uint8_t)); | 732 | sockopt_len = (socklen_t)(sizeof(sctp_assoc_t) + 256 * sizeof(uint8_t)); |
| 731 | authchunks = calloc(1, sockopt_len); | 733 | authchunks = calloc(1, sockopt_len); |
| 734 | if (authchunks == NULL) | ||
| 735 | goto err; | ||
| 732 | ret = getsockopt(fd, IPPROTO_SCTP, SCTP_LOCAL_AUTH_CHUNKS, authchunks, &sockopt_len); | 736 | ret = getsockopt(fd, IPPROTO_SCTP, SCTP_LOCAL_AUTH_CHUNKS, authchunks, &sockopt_len); |
| 733 | OPENSSL_assert(ret >= 0); | 737 | if (ret < 0) { |
| 738 | free(authchunks); | ||
| 739 | goto err; | ||
| 740 | } | ||
| 734 | 741 | ||
| 735 | for (p = (unsigned char*) authchunks->gauth_chunks; | 742 | for (p = (unsigned char*) authchunks->gauth_chunks; |
| 736 | p < (unsigned char*) authchunks + sockopt_len; | 743 | p < (unsigned char*) authchunks + sockopt_len; |
| @@ -753,16 +760,19 @@ BIO_new_dgram_sctp(int fd, int close_flag) | |||
| 753 | event.se_type = SCTP_AUTHENTICATION_EVENT; | 760 | event.se_type = SCTP_AUTHENTICATION_EVENT; |
| 754 | event.se_on = 1; | 761 | event.se_on = 1; |
| 755 | ret = setsockopt(fd, IPPROTO_SCTP, SCTP_EVENT, &event, sizeof(struct sctp_event)); | 762 | ret = setsockopt(fd, IPPROTO_SCTP, SCTP_EVENT, &event, sizeof(struct sctp_event)); |
| 756 | OPENSSL_assert(ret >= 0); | 763 | if (ret < 0) |
| 764 | goto err; | ||
| 757 | #else | 765 | #else |
| 758 | sockopt_len = (socklen_t) sizeof(struct sctp_event_subscribe); | 766 | sockopt_len = (socklen_t) sizeof(struct sctp_event_subscribe); |
| 759 | ret = getsockopt(fd, IPPROTO_SCTP, SCTP_EVENTS, &event, &sockopt_len); | 767 | ret = getsockopt(fd, IPPROTO_SCTP, SCTP_EVENTS, &event, &sockopt_len); |
| 760 | OPENSSL_assert(ret >= 0); | 768 | if (ret < 0) |
| 769 | goto err; | ||
| 761 | 770 | ||
| 762 | event.sctp_authentication_event = 1; | 771 | event.sctp_authentication_event = 1; |
| 763 | 772 | ||
| 764 | ret = setsockopt(fd, IPPROTO_SCTP, SCTP_EVENTS, &event, sizeof(struct sctp_event_subscribe)); | 773 | ret = setsockopt(fd, IPPROTO_SCTP, SCTP_EVENTS, &event, sizeof(struct sctp_event_subscribe)); |
| 765 | OPENSSL_assert(ret >= 0); | 774 | if (ret < 0) |
| 775 | goto err; | ||
| 766 | #endif | 776 | #endif |
| 767 | #endif | 777 | #endif |
| 768 | 778 | ||
| @@ -770,9 +780,14 @@ BIO_new_dgram_sctp(int fd, int close_flag) | |||
| 770 | * larger than the max record size of 2^14 + 2048 + 13 | 780 | * larger than the max record size of 2^14 + 2048 + 13 |
| 771 | */ | 781 | */ |
| 772 | ret = setsockopt(fd, IPPROTO_SCTP, SCTP_PARTIAL_DELIVERY_POINT, &optval, sizeof(optval)); | 782 | ret = setsockopt(fd, IPPROTO_SCTP, SCTP_PARTIAL_DELIVERY_POINT, &optval, sizeof(optval)); |
| 773 | OPENSSL_assert(ret >= 0); | 783 | if (ret < 0) |
| 784 | goto err; | ||
| 774 | 785 | ||
| 775 | return (bio); | 786 | return (bio); |
| 787 | |||
| 788 | err: | ||
| 789 | BIO_vfree(bio); | ||
| 790 | return (NULL); | ||
| 776 | } | 791 | } |
| 777 | 792 | ||
| 778 | int | 793 | int |
| @@ -929,16 +944,25 @@ dgram_sctp_read(BIO *b, char *out, int outl) | |||
| 929 | event.se_type = SCTP_SENDER_DRY_EVENT; | 944 | event.se_type = SCTP_SENDER_DRY_EVENT; |
| 930 | event.se_on = 0; | 945 | event.se_on = 0; |
| 931 | i = setsockopt(b->num, IPPROTO_SCTP, SCTP_EVENT, &event, sizeof(struct sctp_event)); | 946 | i = setsockopt(b->num, IPPROTO_SCTP, SCTP_EVENT, &event, sizeof(struct sctp_event)); |
| 932 | OPENSSL_assert(i >= 0); | 947 | if (i < 0) { |
| 948 | ret = i; | ||
| 949 | break; | ||
| 950 | } | ||
| 933 | #else | 951 | #else |
| 934 | eventsize = sizeof(struct sctp_event_subscribe); | 952 | eventsize = sizeof(struct sctp_event_subscribe); |
| 935 | i = getsockopt(b->num, IPPROTO_SCTP, SCTP_EVENTS, &event, &eventsize); | 953 | i = getsockopt(b->num, IPPROTO_SCTP, SCTP_EVENTS, &event, &eventsize); |
| 936 | OPENSSL_assert(i >= 0); | 954 | if (i < 0) { |
| 955 | ret = i; | ||
| 956 | break; | ||
| 957 | } | ||
| 937 | 958 | ||
| 938 | event.sctp_sender_dry_event = 0; | 959 | event.sctp_sender_dry_event = 0; |
| 939 | 960 | ||
| 940 | i = setsockopt(b->num, IPPROTO_SCTP, SCTP_EVENTS, &event, sizeof(struct sctp_event_subscribe)); | 961 | i = setsockopt(b->num, IPPROTO_SCTP, SCTP_EVENTS, &event, sizeof(struct sctp_event_subscribe)); |
| 941 | OPENSSL_assert(i >= 0); | 962 | if (i < 0) { |
| 963 | ret = i; | ||
| 964 | break; | ||
| 965 | } | ||
| 942 | #endif | 966 | #endif |
| 943 | } | 967 | } |
| 944 | 968 | ||
| @@ -969,8 +993,8 @@ dgram_sctp_read(BIO *b, char *out, int outl) | |||
| 969 | */ | 993 | */ |
| 970 | optlen = (socklen_t) sizeof(int); | 994 | optlen = (socklen_t) sizeof(int); |
| 971 | ret = getsockopt(b->num, SOL_SOCKET, SO_RCVBUF, &optval, &optlen); | 995 | ret = getsockopt(b->num, SOL_SOCKET, SO_RCVBUF, &optval, &optlen); |
| 972 | OPENSSL_assert(ret >= 0); | 996 | if (ret >= 0) |
| 973 | OPENSSL_assert(optval >= 18445); | 997 | OPENSSL_assert(optval >= 18445); |
| 974 | 998 | ||
| 975 | /* Test if SCTP doesn't partially deliver below | 999 | /* Test if SCTP doesn't partially deliver below |
| 976 | * max record size (2^14 + 2048 + 13) | 1000 | * max record size (2^14 + 2048 + 13) |
| @@ -978,8 +1002,8 @@ dgram_sctp_read(BIO *b, char *out, int outl) | |||
| 978 | optlen = (socklen_t) sizeof(int); | 1002 | optlen = (socklen_t) sizeof(int); |
| 979 | ret = getsockopt(b->num, IPPROTO_SCTP, | 1003 | ret = getsockopt(b->num, IPPROTO_SCTP, |
| 980 | SCTP_PARTIAL_DELIVERY_POINT, &optval, &optlen); | 1004 | SCTP_PARTIAL_DELIVERY_POINT, &optval, &optlen); |
| 981 | OPENSSL_assert(ret >= 0); | 1005 | if (ret >= 0) |
| 982 | OPENSSL_assert(optval >= 18445); | 1006 | OPENSSL_assert(optval >= 18445); |
| 983 | 1007 | ||
| 984 | /* Partially delivered notification??? Probably a bug.... */ | 1008 | /* Partially delivered notification??? Probably a bug.... */ |
| 985 | OPENSSL_assert(!(msg.msg_flags & MSG_NOTIFICATION)); | 1009 | OPENSSL_assert(!(msg.msg_flags & MSG_NOTIFICATION)); |
| @@ -1008,16 +1032,21 @@ dgram_sctp_read(BIO *b, char *out, int outl) | |||
| 1008 | 1032 | ||
| 1009 | optlen = (socklen_t)(sizeof(sctp_assoc_t) + 256 * sizeof(uint8_t)); | 1033 | optlen = (socklen_t)(sizeof(sctp_assoc_t) + 256 * sizeof(uint8_t)); |
| 1010 | authchunks = calloc(1, optlen); | 1034 | authchunks = calloc(1, optlen); |
| 1035 | if (authchunks == NULL) { | ||
| 1036 | BIOerr(BIO_F_DGRAM_SCTP_READ, | ||
| 1037 | ERR_R_MALLOC_ERROR); | ||
| 1038 | return (-1); | ||
| 1039 | } | ||
| 1011 | ii = getsockopt(b->num, IPPROTO_SCTP, SCTP_PEER_AUTH_CHUNKS, authchunks, &optlen); | 1040 | ii = getsockopt(b->num, IPPROTO_SCTP, SCTP_PEER_AUTH_CHUNKS, authchunks, &optlen); |
| 1012 | OPENSSL_assert(ii >= 0); | 1041 | if (ii >= 0) { |
| 1013 | 1042 | for (p = (unsigned char*) authchunks->gauth_chunks; | |
| 1014 | for (p = (unsigned char*) authchunks->gauth_chunks; | 1043 | p < (unsigned char*) authchunks + optlen; |
| 1015 | p < (unsigned char*) authchunks + optlen; | 1044 | p += sizeof(uint8_t)) { |
| 1016 | p += sizeof(uint8_t)) { | 1045 | if (*p == OPENSSL_SCTP_DATA_CHUNK_TYPE) |
| 1017 | if (*p == OPENSSL_SCTP_DATA_CHUNK_TYPE) | 1046 | auth_data = 1; |
| 1018 | auth_data = 1; | 1047 | if (*p == OPENSSL_SCTP_FORWARD_CUM_TSN_CHUNK_TYPE) |
| 1019 | if (*p == OPENSSL_SCTP_FORWARD_CUM_TSN_CHUNK_TYPE) | 1048 | auth_forward = 1; |
| 1020 | auth_forward = 1; | 1049 | } |
| 1021 | } | 1050 | } |
| 1022 | 1051 | ||
| 1023 | free(authchunks); | 1052 | free(authchunks); |
