Windows build fixes.

Windows doesn't have ssize_t, sadly. There's SSIZE_T, but defining an
OPENSSL_SSIZE_T seems worse than just using an int.

Change-Id: I09bb5aa03f96da78b619e551f92ed52ce24d9f3f
Reviewed-on: https://boringssl-review.googlesource.com/1352
Reviewed-by: Adam Langley <agl@google.com>
diff --git a/crypto/CMakeLists.txt b/crypto/CMakeLists.txt
index 2e255b8..cbfcd73 100644
--- a/crypto/CMakeLists.txt
+++ b/crypto/CMakeLists.txt
@@ -4,7 +4,7 @@
 	set(PERLASM_STYLE macosx)
 	set(ASM_EXT S)
 	enable_language(ASM)
-else(UNIX)
+elseif(UNIX)
 	set(PERLASM_STYLE elf)
 	set(ASM_EXT S)
 	enable_language(ASM)
diff --git a/crypto/aes/asm/aes-x86_64.pl b/crypto/aes/asm/aes-x86_64.pl
index 08785fe..4b6e1b4 100644
--- a/crypto/aes/asm/aes-x86_64.pl
+++ b/crypto/aes/asm/aes-x86_64.pl
@@ -587,6 +587,7 @@
 $code.=<<___;
 .align	16
 .globl	asm_AES_encrypt
+.type	asm_AES_encrypt,\@function,3
 .hidden	asm_AES_encrypt
 asm_AES_encrypt:
 	push	%rbx
@@ -1182,6 +1183,7 @@
 $code.=<<___;
 .align	16
 .globl	asm_AES_decrypt
+.type	asm_AES_decrypt,\@function,3
 .hidden	asm_AES_decrypt
 asm_AES_decrypt:
 	push	%rbx
@@ -1280,6 +1282,7 @@
 $code.=<<___;
 .align	16
 .globl asm_AES_set_encrypt_key
+.type  asm_AES_set_encrypt_key,\@function,3
 asm_AES_set_encrypt_key:
 	push	%rbx
 	push	%rbp
@@ -1544,6 +1547,7 @@
 $code.=<<___;
 .align	16
 .globl asm_AES_set_decrypt_key
+.type  asm_AES_set_decrypt_key,\@function,3
 asm_AES_set_decrypt_key:
 	push	%rbx
 	push	%rbp
@@ -1636,8 +1640,9 @@
 
 $code.=<<___;
 .align	16
-.extern	OPENSSL_ia32cap_P
 .globl	asm_AES_cbc_encrypt
+.type	asm_AES_cbc_encrypt,\@function,6
+.extern	OPENSSL_ia32cap_P
 .hidden	asm_AES_cbc_encrypt
 asm_AES_cbc_encrypt:
 	cmp	\$0,%rdx	# check length
@@ -2749,45 +2754,45 @@
 
 .section	.pdata
 .align	4
-	.rva	.LSEH_begin_AES_encrypt
-	.rva	.LSEH_end_AES_encrypt
-	.rva	.LSEH_info_AES_encrypt
+	.rva	.LSEH_begin_asm_AES_encrypt
+	.rva	.LSEH_end_asm_AES_encrypt
+	.rva	.LSEH_info_asm_AES_encrypt
 
-	.rva	.LSEH_begin_AES_decrypt
-	.rva	.LSEH_end_AES_decrypt
-	.rva	.LSEH_info_AES_decrypt
+	.rva	.LSEH_begin_asm_AES_decrypt
+	.rva	.LSEH_end_asm_AES_decrypt
+	.rva	.LSEH_info_asm_AES_decrypt
 
-	.rva	.LSEH_begin_AES_set_encrypt_key
-	.rva	.LSEH_end_AES_set_encrypt_key
-	.rva	.LSEH_info_AES_set_encrypt_key
+	.rva	.LSEH_begin_asm_AES_set_encrypt_key
+	.rva	.LSEH_end_asm_AES_set_encrypt_key
+	.rva	.LSEH_info_asm_AES_set_encrypt_key
 
-	.rva	.LSEH_begin_AES_set_decrypt_key
-	.rva	.LSEH_end_AES_set_decrypt_key
-	.rva	.LSEH_info_AES_set_decrypt_key
+	.rva	.LSEH_begin_asm_AES_set_decrypt_key
+	.rva	.LSEH_end_asm_AES_set_decrypt_key
+	.rva	.LSEH_info_asm_AES_set_decrypt_key
 
-	.rva	.LSEH_begin_AES_cbc_encrypt
-	.rva	.LSEH_end_AES_cbc_encrypt
-	.rva	.LSEH_info_AES_cbc_encrypt
+	.rva	.LSEH_begin_asm_AES_cbc_encrypt
+	.rva	.LSEH_end_asm_AES_cbc_encrypt
+	.rva	.LSEH_info_asm_AES_cbc_encrypt
 
 .section	.xdata
 .align	8
-.LSEH_info_AES_encrypt:
+.LSEH_info_asm_AES_encrypt:
 	.byte	9,0,0,0
 	.rva	block_se_handler
 	.rva	.Lenc_prologue,.Lenc_epilogue	# HandlerData[]
-.LSEH_info_AES_decrypt:
+.LSEH_info_asm_AES_decrypt:
 	.byte	9,0,0,0
 	.rva	block_se_handler
 	.rva	.Ldec_prologue,.Ldec_epilogue	# HandlerData[]
-.LSEH_info_AES_set_encrypt_key:
+.LSEH_info_asm_AES_set_encrypt_key:
 	.byte	9,0,0,0
 	.rva	key_se_handler
 	.rva	.Lenc_key_prologue,.Lenc_key_epilogue	# HandlerData[]
-.LSEH_info_AES_set_decrypt_key:
+.LSEH_info_asm_AES_set_decrypt_key:
 	.byte	9,0,0,0
 	.rva	key_se_handler
 	.rva	.Ldec_key_prologue,.Ldec_key_epilogue	# HandlerData[]
-.LSEH_info_AES_cbc_encrypt:
+.LSEH_info_asm_AES_cbc_encrypt:
 	.byte	9,0,0,0
 	.rva	cbc_se_handler
 ___
diff --git a/crypto/base64/base64.c b/crypto/base64/base64.c
index f5525b1..4cd95d6 100644
--- a/crypto/base64/base64.c
+++ b/crypto/base64/base64.c
@@ -57,6 +57,7 @@
 #include <openssl/base64.h>
 
 #include <assert.h>
+#include <limits.h>
 
 
 static const unsigned char data_bin2ascii[65] =
@@ -358,7 +359,7 @@
   }
 }
 
-ssize_t EVP_DecodeBlock(uint8_t *dst, const uint8_t *src, size_t src_len) {
+int EVP_DecodeBlock(uint8_t *dst, const uint8_t *src, size_t src_len) {
   int a, b, c, d;
   uint32_t l;
   size_t i, ret = 0;
@@ -395,5 +396,9 @@
     ret += 3;
   }
 
+  if (ret > INT_MAX) {
+    return -1;
+  }
+
   return ret;
 }
diff --git a/crypto/bio/internal.h b/crypto/bio/internal.h
index b0c9c31..dd3d800 100644
--- a/crypto/bio/internal.h
+++ b/crypto/bio/internal.h
@@ -68,6 +68,7 @@
 #include <sys/socket.h>
 #else
 #include <WinSock2.h>
+#include <WS2tcpip.h>
 #endif
 
 #if defined(__cplusplus)
diff --git a/crypto/dh/dh.c b/crypto/dh/dh.c
index 3e6ae6d..cee306b 100644
--- a/crypto/dh/dh.c
+++ b/crypto/dh/dh.c
@@ -147,7 +147,7 @@
   return DH_default_method.generate_key(dh);
 }
 
-ssize_t DH_compute_key(unsigned char *out, const BIGNUM *peers_key, DH *dh) {
+int DH_compute_key(unsigned char *out, const BIGNUM *peers_key, DH *dh) {
   if (dh->meth->compute_key) {
     return dh->meth->compute_key(dh, out, peers_key);
   }
diff --git a/crypto/dh/dh_impl.c b/crypto/dh/dh_impl.c
index edc3db7..2ad4454 100644
--- a/crypto/dh/dh_impl.c
+++ b/crypto/dh/dh_impl.c
@@ -252,7 +252,7 @@
   return ok;
 }
 
-static ssize_t compute_key(DH *dh, unsigned char *out, const BIGNUM *pub_key) {
+static int compute_key(DH *dh, unsigned char *out, const BIGNUM *pub_key) {
   BN_CTX *ctx = NULL;
   BN_MONT_CTX *mont = NULL;
   BIGNUM *shared_key;
diff --git a/crypto/mem.c b/crypto/mem.c
index e35d98b..1eb97c9 100644
--- a/crypto/mem.c
+++ b/crypto/mem.c
@@ -64,6 +64,10 @@
 #include <stdio.h>
 #include <string.h>
 
+#if defined(OPENSSL_WINDOWS)
+#include <Windows.h>
+#endif
+
 
 void *OPENSSL_realloc_clean(void *ptr, size_t old_size, size_t new_size) {
   void *ret = NULL;
@@ -94,15 +98,15 @@
 }
 
 void OPENSSL_cleanse(void *ptr, size_t len) {
-  memset(ptr, 0, len);
+#if defined(OPENSSL_WINDOWS)
+	SecureZeroMemory(ptr, len);
+#else
+	memset(ptr, 0, len);
 
 #if !defined(OPENSSL_NO_ASM)
   /* As best as we can tell, this is sufficient to break any optimisations that
      might try to eliminate "superfluous" memsets. If there's an easy way to
      detect memset_s, it would be better to use that. */
-#if defined(OPENSSL_WINDOWS)
-  __asm;
-#else
   __asm__ __volatile__("" : : "r"(ptr) : "memory");
 #endif
 #endif  /* !OPENSSL_NO_ASM */
@@ -155,7 +159,7 @@
 #if defined(OPENSSL_WINDOWS)
 
 int OPENSSL_strcasecmp(const char *a, const char *b) {
-  return _stricmp(a, b, n);
+  return _stricmp(a, b);
 }
 
 int OPENSSL_strncasecmp(const char *a, const char *b, size_t n) {
diff --git a/crypto/perlasm/x86_64-xlate.pl b/crypto/perlasm/x86_64-xlate.pl
index e0695e0..8018fbd 100755
--- a/crypto/perlasm/x86_64-xlate.pl
+++ b/crypto/perlasm/x86_64-xlate.pl
@@ -918,7 +918,13 @@
 		}
 		@args = reverse(@args);
 		undef $sz if ($nasm && $opcode->mnemonic() eq "lea");
-		printf "\t%s\t%s",$insn,join(",",map($_->out($sz),@args));
+
+		if ($insn eq "movq" && $#args == 1 && $args[0]->out($sz) eq "xmm0" && $args[1]->out($sz) eq "rax") {
+		    # I have no clue why MASM can't parse this instruction.
+		    printf "DB 66h, 48h, 0fh, 6eh, 0c0h";
+		} else {
+		    printf "\t%s\t%s",$insn,join(",",map($_->out($sz),@args));
+		}
 	    }
 	} else {
 	    printf "\t%s",$opcode->out();
diff --git a/crypto/rc4/asm/rc4-x86_64.pl b/crypto/rc4/asm/rc4-x86_64.pl
index 797ae13..c033a41 100644
--- a/crypto/rc4/asm/rc4-x86_64.pl
+++ b/crypto/rc4/asm/rc4-x86_64.pl
@@ -645,20 +645,20 @@
 
 .section	.pdata
 .align	4
-	.rva	.LSEH_begin_RC4
-	.rva	.LSEH_end_RC4
-	.rva	.LSEH_info_RC4
+	.rva	.LSEH_begin_asm_RC4
+	.rva	.LSEH_end_asm_RC4
+	.rva	.LSEH_info_asm_RC4
 
-	.rva	.LSEH_begin_RC4_set_key
-	.rva	.LSEH_end_RC4_set_key
-	.rva	.LSEH_info_RC4_set_key
+	.rva	.LSEH_begin_asm_RC4_set_key
+	.rva	.LSEH_end_asm_RC4_set_key
+	.rva	.LSEH_info_asm_RC4_set_key
 
 .section	.xdata
 .align	8
-.LSEH_info_RC4:
+.LSEH_info_asm_RC4:
 	.byte	9,0,0,0
 	.rva	stream_se_handler
-.LSEH_info_RC4_set_key:
+.LSEH_info_asm_RC4_set_key:
 	.byte	9,0,0,0
 	.rva	key_se_handler
 ___
diff --git a/crypto/thread.c b/crypto/thread.c
index 1c9926c..6472cd3 100644
--- a/crypto/thread.c
+++ b/crypto/thread.c
@@ -163,7 +163,7 @@
     return;
   }
 
-#if defined(OPENSSL_SYS_WIN32)
+#if defined(OPENSSL_WINDOWS)
   CRYPTO_THREADID_set_numeric(id, (unsigned long)GetCurrentThreadId());
 #else
   /* For everything else, default to using the address of 'errno' */
diff --git a/crypto/time_support.c b/crypto/time_support.c
index f845e98..5b300b3 100644
--- a/crypto/time_support.c
+++ b/crypto/time_support.c
@@ -65,7 +65,7 @@
 
 struct tm *OPENSSL_gmtime(const time_t *time, struct tm *result) {
 #if defined(OPENSSL_WINDOWS)
-  if (_gmtime_s(result, time)) {
+  if (gmtime_s(result, time)) {
     return NULL;
   }
   return result;
diff --git a/include/openssl/base.h b/include/openssl/base.h
index 4bc10e5..d79d63f 100644
--- a/include/openssl/base.h
+++ b/include/openssl/base.h
@@ -89,7 +89,7 @@
 #define OPENSSL_APPLE
 #endif
 
-#if defined(WIN32)
+#if defined(WIN32) || defined(_WIN32)
 #define OPENSSL_WINDOWS
 #endif
 
diff --git a/include/openssl/base64.h b/include/openssl/base64.h
index 606d5ab..38cb0ee 100644
--- a/include/openssl/base64.h
+++ b/include/openssl/base64.h
@@ -134,9 +134,8 @@
  *
  * WARNING: EVP_DecodeBlock's return value does not take padding into
  * account. TODO(davidben): Possible or worth it to fix or add new API? */
-OPENSSL_EXPORT ssize_t
-    EVP_DecodeBlock(uint8_t *dst, const uint8_t *src, size_t src_len);
-
+OPENSSL_EXPORT int EVP_DecodeBlock(uint8_t *dst, const uint8_t *src,
+                                   size_t src_len);
 
 struct evp_encode_ctx_st {
   unsigned num;    /* number saved in a partial encode/decode */
diff --git a/include/openssl/dh.h b/include/openssl/dh.h
index 84fb456..9d8bda2 100644
--- a/include/openssl/dh.h
+++ b/include/openssl/dh.h
@@ -127,8 +127,8 @@
  * writes it as a big-endian integer into |out|, which must have |DH_size|
  * bytes of space. It returns the number of bytes written, or a negative number
  * on error. */
-OPENSSL_EXPORT ssize_t
-    DH_compute_key(uint8_t *out, const BIGNUM *peers_key, DH *dh);
+OPENSSL_EXPORT int DH_compute_key(uint8_t *out, const BIGNUM *peers_key,
+                                  DH *dh);
 
 
 /* Utility functions. */
@@ -217,8 +217,8 @@
   /* generate_parameters is called by |DH_generate_key|. */
   int (*generate_key)(DH *dh);
 
-  /* generate_parameters is called by |DH_compute_key|. */
-  ssize_t (*compute_key)(DH *dh, uint8_t *out, const BIGNUM *pub_key);
+  /* compute_key is called by |DH_compute_key|. */
+  int (*compute_key)(DH *dh, uint8_t *out, const BIGNUM *pub_key);
 };
 
 struct dh_st {
diff --git a/include/openssl/dtls1.h b/include/openssl/dtls1.h
index 5871bdb..c835789 100644
--- a/include/openssl/dtls1.h
+++ b/include/openssl/dtls1.h
@@ -53,30 +53,20 @@
  *
  * This product includes cryptographic software written by Eric Young
  * (eay@cryptsoft.com).  This product includes software written by Tim
- * Hudson (tjh@cryptsoft.com).
- *
- */
+ * Hudson (tjh@cryptsoft.com). */
 
 #ifndef HEADER_DTLS1_H
 #define HEADER_DTLS1_H
 
+#include <openssl/base.h>
 #include <openssl/buf.h>
 #include <openssl/pqueue.h>
-#if defined(OPENSSL_WINDOWS)
-/* Including winsock.h pollutes the namespace too much with defines for
- * X509_NAME etc. */
-typedef struct timeval {
-	long tv_sec;
-	long tv_usec;
-} timeval;
-#else
-#include <sys/time.h>
-#endif
 
 #ifdef  __cplusplus
 extern "C" {
 #endif
 
+
 #define DTLS1_VERSION			0xFEFF
 #define DTLS1_BAD_VER			0x0100
 #define DTLS1_2_VERSION			0xFEFD
@@ -108,6 +98,19 @@
 
 #ifndef OPENSSL_NO_SSL_INTERN
 
+
+#if defined(OPENSSL_WINDOWS)
+/* Because of Windows header issues, we can't get the normal declaration of
+ * timeval. */
+typedef struct OPENSSL_timeval_st {
+	long tv_sec;
+	long tv_usec;
+} OPENSSL_timeval;
+#else
+#include <sys/time.h>
+typedef struct timeval OPENSSL_timeval;
+#endif
+
 typedef struct dtls1_bitmap_st
 	{
 	unsigned long map;		/* track 32 packets on 32-bit systems
@@ -223,8 +226,10 @@
 
 	struct dtls1_timeout_st timeout;
 
-	/* Indicates when the last handshake msg or heartbeat sent will timeout */
-	struct timeval next_timeout;
+	/* Indicates when the last handshake msg or heartbeat sent will
+	 * timeout. Because of header issues on Windows, this cannot actually
+	 * be a struct timeval. */
+	OPENSSL_timeval next_timeout;
 
 	/* Timeout duration */
 	unsigned short timeout_duration;
diff --git a/include/openssl/ssl.h b/include/openssl/ssl.h
index 497baa9..d1734a8 100644
--- a/include/openssl/ssl.h
+++ b/include/openssl/ssl.h
@@ -723,11 +723,7 @@
 struct ssl_aead_ctx_st;
 typedef struct ssl_aead_ctx_st SSL_AEAD_CTX;
 
-#if defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_WIN32)
-#define SSL_MAX_CERT_LIST_DEFAULT 1024*30 /* 30k max cert list :-) */
-#else
-#define SSL_MAX_CERT_LIST_DEFAULT 1024*100 /* 100k max cert list :-) */
-#endif
+#define SSL_MAX_CERT_LIST_DEFAULT 1024*100 /* 100k max cert list */
 
 #define SSL_SESSION_CACHE_MAX_SIZE_DEFAULT	(1024*20)
 
diff --git a/include/openssl/x509.h b/include/openssl/x509.h
index ac23f9c..29fba40 100644
--- a/include/openssl/x509.h
+++ b/include/openssl/x509.h
@@ -86,13 +86,6 @@
 #endif
 
 
-#ifdef OPENSSL_SYS_WIN32
-/* Under Win32 these are defined in wincrypt.h */
-#undef X509_NAME
-#undef X509_CERT_PAIR
-#undef X509_EXTENSIONS
-#endif
-
 #define X509_FILETYPE_PEM	1
 #define X509_FILETYPE_ASN1	2
 #define X509_FILETYPE_DEFAULT	3
diff --git a/ssl/d1_lib.c b/ssl/d1_lib.c
index 454236f..65cd7da 100644
--- a/ssl/d1_lib.c
+++ b/ssl/d1_lib.c
@@ -62,6 +62,7 @@
 #include <sys/timeb.h>
 #else
 #include <sys/socket.h>
+#include <sys/time.h>
 #endif
 
 #include <openssl/err.h>
@@ -70,7 +71,8 @@
 
 #include "ssl_locl.h"
 
-static void get_current_time(struct timeval *t);
+static void get_current_time(OPENSSL_timeval *t);
+static OPENSSL_timeval* dtls1_get_timeout(SSL *s, OPENSSL_timeval* timeleft);
 static void dtls1_set_handshake_header(SSL *s, int type, unsigned long len);
 static int dtls1_handshake_write(SSL *s);
 int dtls1_listen(SSL *s, struct sockaddr *client);
@@ -291,7 +293,7 @@
 	switch (cmd)
 		{
 	case DTLS_CTRL_GET_TIMEOUT:
-		if (dtls1_get_timeout(s, (struct timeval*) parg) != NULL)
+		if (dtls1_get_timeout(s, (OPENSSL_timeval*) parg) != NULL)
 			{
 			ret = 1;
 			}
@@ -339,16 +341,16 @@
 		}
 	
 	/* Set timeout to current time */
-	get_current_time(&(s->d1->next_timeout));
+	get_current_time(&s->d1->next_timeout);
 
 	/* Add duration to current time */
 	s->d1->next_timeout.tv_sec += s->d1->timeout_duration;
-	BIO_ctrl(SSL_get_rbio(s), BIO_CTRL_DGRAM_SET_NEXT_TIMEOUT, 0, &(s->d1->next_timeout));
+	BIO_ctrl(SSL_get_rbio(s), BIO_CTRL_DGRAM_SET_NEXT_TIMEOUT, 0, &s->d1->next_timeout);
 	}
 
-struct timeval* dtls1_get_timeout(SSL *s, struct timeval* timeleft)
+static OPENSSL_timeval* dtls1_get_timeout(SSL *s, OPENSSL_timeval* timeleft)
 	{
-	struct timeval timenow;
+	OPENSSL_timeval timenow;
 
 	/* If no timeout is set, just return NULL */
 	if (s->d1->next_timeout.tv_sec == 0 && s->d1->next_timeout.tv_usec == 0)
@@ -364,12 +366,12 @@
 		(s->d1->next_timeout.tv_sec == timenow.tv_sec &&
 		 s->d1->next_timeout.tv_usec <= timenow.tv_usec))
 		{
-		memset(timeleft, 0, sizeof(struct timeval));
+		memset(timeleft, 0, sizeof(OPENSSL_timeval));
 		return timeleft;
 		}
 
 	/* Calculate time left until timer expires */
-	memcpy(timeleft, &(s->d1->next_timeout), sizeof(struct timeval));
+	memcpy(timeleft, &s->d1->next_timeout, sizeof(OPENSSL_timeval));
 	timeleft->tv_sec -= timenow.tv_sec;
 	timeleft->tv_usec -= timenow.tv_usec;
 	if (timeleft->tv_usec < 0)
@@ -384,7 +386,7 @@
 	 */
 	if (timeleft->tv_sec == 0 && timeleft->tv_usec < 15000)
 		{
-		memset(timeleft, 0, sizeof(struct timeval));
+		memset(timeleft, 0, sizeof(OPENSSL_timeval));
 		}
 	
 
@@ -393,7 +395,7 @@
 
 int dtls1_is_timer_expired(SSL *s)
 	{
-	struct timeval timeleft;
+	OPENSSL_timeval timeleft;
 
 	/* Get time left until timeout, return false if no timer running */
 	if (dtls1_get_timeout(s, &timeleft) == NULL)
@@ -423,9 +425,9 @@
 	{
 	/* Reset everything */
 	memset(&(s->d1->timeout), 0, sizeof(struct dtls1_timeout_st));
-	memset(&(s->d1->next_timeout), 0, sizeof(struct timeval));
+	memset(&s->d1->next_timeout, 0, sizeof(OPENSSL_timeval));
 	s->d1->timeout_duration = 1;
-	BIO_ctrl(SSL_get_rbio(s), BIO_CTRL_DGRAM_SET_NEXT_TIMEOUT, 0, &(s->d1->next_timeout));
+	BIO_ctrl(SSL_get_rbio(s), BIO_CTRL_DGRAM_SET_NEXT_TIMEOUT, 0, &s->d1->next_timeout);
 	/* Clear retransmission buffer */
 	dtls1_clear_record_buffer(s);
 	}
@@ -473,13 +475,13 @@
 	return dtls1_retransmit_buffered_messages(s);
 	}
 
-static void get_current_time(struct timeval *t)
+static void get_current_time(OPENSSL_timeval *t)
 {
-#ifdef OPENSSL_SYS_WIN32
-	struct _timeb tb;
-	_ftime(&tb);
-	t->tv_sec = (long)tb.time;
-	t->tv_usec = (long)tb.millitm * 1000;
+#if defined(OPENSSL_WINDOWS)
+	struct _timeb time;
+	_ftime(&time);
+	t->tv_sec = time.time;
+	t->tv_usec = time.millitm * 1000;
 #else
 	gettimeofday(t, NULL);
 #endif
diff --git a/ssl/s3_both.c b/ssl/s3_both.c
index 9476b53..de2a9f7 100644
--- a/ssl/s3_both.c
+++ b/ssl/s3_both.c
@@ -183,12 +183,6 @@
                         s->s3->previous_server_finished_len=i;
                         }
 
-#ifdef OPENSSL_SYS_WIN16
-		/* MSVC 1.5 does not clear the top bytes of the word unless
-		 * I do this.
-		 */
-		l&=0xffff;
-#endif
 		ssl_set_handshake_header(s, SSL3_MT_FINISHED, l);
 		s->state=b;
 		}
diff --git a/ssl/ssl_locl.h b/ssl/ssl_locl.h
index e13b8bc..3d72a63 100644
--- a/ssl/ssl_locl.h
+++ b/ssl/ssl_locl.h
@@ -1002,7 +1002,6 @@
 void dtls1_get_ccs_header(unsigned char *data, struct ccs_header_st *ccs_hdr);
 void dtls1_reset_seq_numbers(SSL *s, int rw);
 long dtls1_default_timeout(void);
-struct timeval* dtls1_get_timeout(SSL *s, struct timeval* timeleft);
 int dtls1_check_timeout_num(SSL *s);
 int dtls1_handle_timeout(SSL *s);
 const SSL_CIPHER *dtls1_get_cipher(unsigned int u);
diff --git a/ssl/t1_lib.c b/ssl/t1_lib.c
index 8e77ef2..df7b3fb 100644
--- a/ssl/t1_lib.c
+++ b/ssl/t1_lib.c
@@ -1653,7 +1653,7 @@
  *   returns: 1 on success. */
 static int tls1_alpn_handle_client_hello(SSL *s, CBS *cbs, int *out_alert)
 	{
-	CBS protocol_name_list;
+	CBS protocol_name_list, protocol_name_list_copy;
 	const unsigned char *selected;
 	unsigned char selected_len;
 	int r;
@@ -1667,7 +1667,7 @@
 		goto parse_error;
 
 	/* Validate the protocol list. */
-	CBS protocol_name_list_copy = protocol_name_list;
+	protocol_name_list_copy = protocol_name_list;
 	while (CBS_len(&protocol_name_list_copy) > 0)
 		{
 		CBS protocol_name;
diff --git a/ssl/test/bssl_shim.cc b/ssl/test/bssl_shim.cc
index c0cfcc3..04c1a4e 100644
--- a/ssl/test/bssl_shim.cc
+++ b/ssl/test/bssl_shim.cc
@@ -12,12 +12,17 @@
  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
 
+#include <openssl/base.h>
+
+#if !defined(OPENSSL_WINDOWS)
 #include <arpa/inet.h>
 #include <netinet/in.h>
 #include <signal.h>
 #include <sys/socket.h>
-#include <sys/types.h>
 #include <unistd.h>
+#endif
+
+#include <sys/types.h>
 
 #include <openssl/bio.h>
 #include <openssl/bytestring.h>
@@ -435,7 +440,9 @@
 int main(int argc, char **argv) {
   int is_server, resume;
 
+#if !defined(OPENSSL_WINDOWS)
   signal(SIGPIPE, SIG_IGN);
+#endif
 
   if (argc < 3) {
     return usage(argv[0]);