BIO_new_dgram_sctp, dgram_sctp_read: zero entire authchunks
[openssl.git] / crypto / bio / bss_dgram.c
index 3b21bf04c467d208a4768acc2c51b1d59d2d646a..821320ae237ae11445a34ad3e875fc5a43b613d5 100644 (file)
@@ -951,7 +951,7 @@ BIO *BIO_new_dgram_sctp(int fd, int close_flag)
         * already, otherwise the connected socket won't use it. */
        sockopt_len = (socklen_t)(sizeof(sctp_assoc_t) + 256 * sizeof(uint8_t));
        authchunks = OPENSSL_malloc(sockopt_len);
-       memset(authchunks, 0, sizeof(sockopt_len));
+       memset(authchunks, 0, sockopt_len);
        ret = getsockopt(fd, IPPROTO_SCTP, SCTP_LOCAL_AUTH_CHUNKS, authchunks, &sockopt_len);
        OPENSSL_assert(ret >= 0);
 
@@ -1241,7 +1241,7 @@ static int dgram_sctp_read(BIO *b, char *out, int outl)
 
                        optlen = (socklen_t)(sizeof(sctp_assoc_t) + 256 * sizeof(uint8_t));
                        authchunks = OPENSSL_malloc(optlen);
-                       memset(authchunks, 0, sizeof(optlen));
+                       memset(authchunks, 0, optlen);
                        ii = getsockopt(b->num, IPPROTO_SCTP, SCTP_PEER_AUTH_CHUNKS, authchunks, &optlen);
                        OPENSSL_assert(ii >= 0);
 
@@ -1381,7 +1381,7 @@ static long dgram_sctp_ctrl(BIO *b, int cmd, long num, void *ptr)
        bio_dgram_sctp_data *data = NULL;
        socklen_t sockopt_len = 0;
        struct sctp_authkeyid authkeyid;
-       struct sctp_authkey *authkey;
+       struct sctp_authkey *authkey = NULL;
 
        data = (bio_dgram_sctp_data *)b->ptr;
 
@@ -1436,6 +1436,11 @@ static long dgram_sctp_ctrl(BIO *b, int cmd, long num, void *ptr)
                /* Add new key */
                sockopt_len = sizeof(struct sctp_authkey) + 64 * sizeof(uint8_t);
                authkey = OPENSSL_malloc(sockopt_len);
+               if (authkey == NULL)
+                       {
+                       ret = -1;
+                       break;
+                       }
                memset(authkey, 0x00, sockopt_len);
                authkey->sca_keynumber = authkeyid.scact_keynumber + 1;
 #ifndef __FreeBSD__
@@ -1448,6 +1453,7 @@ static long dgram_sctp_ctrl(BIO *b, int cmd, long num, void *ptr)
 
                ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_KEY, authkey, sockopt_len);
                OPENSSL_free(authkey);
+               authkey = NULL;
                if (ret < 0) break;
 
                /* Reset active key */