Commit 6c61726b authored by Dr. Stephen Henson's avatar Dr. Stephen Henson
Browse files

Lots of Win32 fixes for DTLS.

1. "unsigned long long" isn't portable changed: to BN_ULLONG.
2. The LL prefix isn't allowed in VC++ but it isn't needed where it is used.
2. Avoid lots of compiler warnings about signed/unsigned mismatches.
3. Include new library directory pqueue in mk1mf build system.
4. Update symbols.
parent cd202fe2
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -275,7 +275,7 @@ int MAIN(int argc, char **argv)
#endif

	struct sockaddr peer;
	socklen_t peerlen = sizeof(peer);
	int peerlen = sizeof(peer);
	int enable_timeouts = 0 ;
	long mtu = 0;

@@ -643,7 +643,7 @@ re_start:
		struct timeval timeout;

		sbio=BIO_new_dgram(s,BIO_NOCLOSE);
		if (getsockname(s, &peer, &peerlen) < 0)
		if (getsockname(s, &peer, (void *)&peerlen) < 0)
			{
			BIO_printf(bio_err, "getsockname:errno=%d\n",
				get_last_socket_error());
+12 −7
Original line number Diff line number Diff line
@@ -64,8 +64,6 @@
#define USE_SOCKETS
#include "cryptlib.h"

#include <sys/socket.h>

#include <openssl/bio.h>

#define IP_MTU      14 /* linux is lame */
@@ -174,13 +172,18 @@ static int dgram_read(BIO *b, char *out, int outl)
	bio_dgram_data *data = (bio_dgram_data *)b->ptr;

	struct sockaddr peer;
	socklen_t peerlen = sizeof(peer);
	int peerlen = sizeof(peer);

	if (out != NULL)
		{
		clear_socket_error();
		memset(&peer, 0x00, peerlen);
		ret=recvfrom(b->num,out,outl,0,&peer,&peerlen);
		/* Last arg in recvfrom is signed on some platforms and
		 * unsigned on others. It is of type socklen_t on some
		 * but this is not universal. Cast to (void *) to avoid
		 * compiler warnings.
		 */
		ret=recvfrom(b->num,out,outl,0,&peer,(void *)&peerlen);

		if ( ! data->connected  && ret > 0)
			BIO_ctrl(b, BIO_CTRL_DGRAM_CONNECT, 0, &peer);
@@ -303,7 +306,7 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
#endif
	case BIO_CTRL_DGRAM_QUERY_MTU:
         sockopt_len = sizeof(sockopt_val);
		if ((ret = getsockopt(b->num, IPPROTO_IP, IP_MTU, &sockopt_val,
		if ((ret = getsockopt(b->num, IPPROTO_IP, IP_MTU, (void *)&sockopt_val,
			&sockopt_len)) < 0 || sockopt_val < 0)
			{ ret = 0; }
		else
@@ -345,7 +348,7 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
		break;
	case BIO_CTRL_DGRAM_GET_RECV_TIMEOUT:
		if ( getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, 
			ptr, (socklen_t *)&ret) < 0)
			ptr, (void *)&ret) < 0)
			{ perror("getsockopt"); ret = -1; }
		break;
	case BIO_CTRL_DGRAM_SET_SEND_TIMEOUT:
@@ -355,7 +358,7 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
		break;
	case BIO_CTRL_DGRAM_GET_SEND_TIMEOUT:
		if ( getsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO, 
			ptr, (socklen_t *)&ret) < 0)
			ptr, (void *)&ret) < 0)
			{ perror("getsockopt"); ret = -1; }
		break;
	case BIO_CTRL_DGRAM_GET_SEND_TIMER_EXP:
@@ -369,6 +372,7 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
		else
			ret = 0;
		break;
#ifdef EMSGSIZE
	case BIO_CTRL_DGRAM_MTU_EXCEEDED:
		if ( data->_errno == EMSGSIZE)
			{
@@ -378,6 +382,7 @@ static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
		else
			ret = 0;
		break;
#endif
	default:
		ret=0;
		break;
+4 −3
Original line number Diff line number Diff line
@@ -57,8 +57,9 @@
 *
 */

#include "cryptlib.h"
#include <openssl/bn.h>
#include "pqueue.h"
#include "crypto.h"

typedef struct _pqueue
	{
@@ -67,7 +68,7 @@ typedef struct _pqueue
	} pqueue_s;

pitem *
pitem_new(unsigned long long priority, void *data)
pitem_new(BN_ULLONG priority, void *data)
	{
	pitem *item = (pitem *) OPENSSL_malloc(sizeof(pitem));
	if (item == NULL) return NULL;
@@ -160,7 +161,7 @@ pqueue_pop(pqueue_s *pq)
	}

pitem *
pqueue_find(pqueue_s *pq, unsigned long long priority)
pqueue_find(pqueue_s *pq, BN_ULLONG priority)
	{
	pitem *next, *prev = NULL;
	pitem *found = NULL;
+3 −3
Original line number Diff line number Diff line
@@ -68,14 +68,14 @@ typedef struct _pqueue *pqueue;

typedef struct _pitem
	{
	unsigned long long priority;
	BN_ULLONG priority;
	void *data;
	struct _pitem *next;
	} pitem;

typedef struct _pitem *piterator;

pitem *pitem_new(unsigned long long priority, void *data);
pitem *pitem_new(BN_ULLONG priority, void *data);
void   pitem_free(pitem *item);

pqueue pqueue_new(void);
@@ -84,7 +84,7 @@ void pqueue_free(pqueue pq);
pitem *pqueue_insert(pqueue pq, pitem *item);
pitem *pqueue_peek(pqueue pq);
pitem *pqueue_pop(pqueue pq);
pitem *pqueue_find(pqueue pq, unsigned long long priority);
pitem *pqueue_find(pqueue pq, BN_ULLONG priority);
pitem *pqueue_iterator(pqueue pq);
pitem *pqueue_next(piterator *iter);

+7 −7
Original line number Diff line number Diff line
@@ -222,7 +222,7 @@ int dtls1_do_write(SSL *s, int type)

	if ( s->init_off == 0  && type == SSL3_RT_HANDSHAKE)
		OPENSSL_assert(s->init_num == 
			s->d1->w_msg_hdr.msg_len + DTLS1_HM_HEADER_LENGTH);
			(int)s->d1->w_msg_hdr.msg_len + DTLS1_HM_HEADER_LENGTH);

	frag_off = 0;
	while( s->init_num)
@@ -289,7 +289,7 @@ int dtls1_do_write(SSL *s, int type)
			
			/* bad if this assert fails, only part of the handshake
			 * message got sent.  but why would this happen? */
			OPENSSL_assert(len == ret); 
			OPENSSL_assert(len == (unsigned int)ret); 
			
			if (type == SSL3_RT_HANDSHAKE && ! s->d1->retransmitting)
				/* should not be done for 'Hello Request's, but in that case
@@ -360,7 +360,7 @@ long dtls1_get_message(SSL *s, int st1, int stn, int mt, long max, int *ok)
		else if ( i <= 0 && !*ok)
			return i;

		if (s->d1->r_msg_hdr.msg_len == s->init_num - DTLS1_HM_HEADER_LENGTH)
		if (s->d1->r_msg_hdr.msg_len == (unsigned int)s->init_num - DTLS1_HM_HEADER_LENGTH)
			{
			memset(&(s->d1->r_msg_hdr), 0x00, sizeof(struct hm_header_st));

@@ -413,7 +413,7 @@ dtls1_retrieve_buffered_fragment(SSL *s, unsigned long *copied)
    frag = (hm_fragment *)item->data;
    
    if ( s->d1->handshake_read_seq == frag->msg_header.seq &&
        frag->msg_header.frag_off <= s->init_num - DTLS1_HM_HEADER_LENGTH)
        frag->msg_header.frag_off <= (unsigned int)s->init_num - DTLS1_HM_HEADER_LENGTH)
        {
        pqueue_pop(s->d1->buffered_messages);
        overlap = s->init_num - DTLS1_HM_HEADER_LENGTH 
@@ -685,7 +685,7 @@ dtls1_get_message_fragment(SSL *s, int st1, int stn, long max, int *ok)

    /* XDTLS:  an incorrectly formatted fragment should cause the 
     * handshake to fail */
	OPENSSL_assert(i == frag_len);
	OPENSSL_assert(i == (int)frag_len);

#if 0
    /* Successfully read a fragment.
@@ -1049,12 +1049,12 @@ dtls1_buffer_message(SSL *s, int is_ccs)
    if ( is_ccs)
        {
        OPENSSL_assert(s->d1->w_msg_hdr.msg_len + 
            DTLS1_CCS_HEADER_LENGTH == s->init_num);
            DTLS1_CCS_HEADER_LENGTH == (unsigned int)s->init_num);
        }
    else
        {
        OPENSSL_assert(s->d1->w_msg_hdr.msg_len + 
            DTLS1_HM_HEADER_LENGTH == s->init_num);
            DTLS1_HM_HEADER_LENGTH == (unsigned int)s->init_num);
        }

    frag->msg_header.msg_len = s->d1->w_msg_hdr.msg_len;
Loading