From 8aa02e97a782a4229936d5df6da42db3efe4acd1 Mon Sep 17 00:00:00 2001
From: Ben Laurie <ben@openssl.org>
Date: Mon, 29 Dec 2008 13:35:08 +0000
Subject: [PATCH] Make sure a bad parameter to RSA_verify_PKCS1_PSS() doesn't
 lead to a crash. (Coverity ID 135).

---
 crypto/rsa/rsa.h     | 1 +
 crypto/rsa/rsa_err.c | 3 ++-
 crypto/rsa/rsa_pss.c | 6 ++++++
 ssl/s3_pkt.c         | 1 +
 4 files changed, 10 insertions(+), 1 deletion(-)

diff --git a/crypto/rsa/rsa.h b/crypto/rsa/rsa.h
index cf7434365..91cd4198c 100644
--- a/crypto/rsa/rsa.h
+++ b/crypto/rsa/rsa.h
@@ -448,6 +448,7 @@ void ERR_load_RSA_strings(void);
 
 /* Reason codes. */
 #define RSA_R_ALGORITHM_MISMATCH			 100
+#define RSA_R_BAD_ARGUMENT				 149
 #define RSA_R_BAD_E_VALUE				 101
 #define RSA_R_BAD_FIXED_HEADER_DECRYPT			 102
 #define RSA_R_BAD_PAD_BYTE_COUNT			 103
diff --git a/crypto/rsa/rsa_err.c b/crypto/rsa/rsa_err.c
index 0577fbb1e..a53c5f6bf 100644
--- a/crypto/rsa/rsa_err.c
+++ b/crypto/rsa/rsa_err.c
@@ -1,6 +1,6 @@
 /* crypto/rsa/rsa_err.c */
 /* ====================================================================
- * Copyright (c) 1999-2007 The OpenSSL Project.  All rights reserved.
+ * Copyright (c) 1999-2008 The OpenSSL Project.  All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -124,6 +124,7 @@ static ERR_STRING_DATA RSA_str_functs[]=
 static ERR_STRING_DATA RSA_str_reasons[]=
 	{
 {ERR_REASON(RSA_R_ALGORITHM_MISMATCH)    ,"algorithm mismatch"},
+{ERR_REASON(RSA_R_BAD_ARGUMENT)          ,"bad argument"},
 {ERR_REASON(RSA_R_BAD_E_VALUE)           ,"bad e value"},
 {ERR_REASON(RSA_R_BAD_FIXED_HEADER_DECRYPT),"bad fixed header decrypt"},
 {ERR_REASON(RSA_R_BAD_PAD_BYTE_COUNT)    ,"bad pad byte count"},
diff --git a/crypto/rsa/rsa_pss.c b/crypto/rsa/rsa_pss.c
index 7d5b4781a..2e44194bd 100644
--- a/crypto/rsa/rsa_pss.c
+++ b/crypto/rsa/rsa_pss.c
@@ -81,6 +81,12 @@ int RSA_verify_PKCS1_PSS(RSA *rsa, const unsigned char *mHash,
 	EVP_MD_CTX ctx;
 	unsigned char H_[EVP_MAX_MD_SIZE];
 
+	if (Hash == NULL)
+		{
+		RSAerr(RSA_F_RSA_VERIFY_PKCS1_PSS, RSA_R_BAD_ARGUMENT);
+		goto err;
+		}
+
 	hLen = EVP_MD_size(Hash);
 	/*
 	 * Negative sLen has special meanings:
diff --git a/ssl/s3_pkt.c b/ssl/s3_pkt.c
index 561ba5cf2..330918a78 100644
--- a/ssl/s3_pkt.c
+++ b/ssl/s3_pkt.c
@@ -412,6 +412,7 @@ printf("\n");
 
 	if (!clear)
 		{
+		/* !clear => s->read_hash != NULL => mac_size != -1 */
 		mac_size=EVP_MD_CTX_size(s->read_hash);
 
 		if (rr->length > SSL3_RT_MAX_COMPRESSED_LENGTH+extra+mac_size)