Bug 734534: Fix a buffer length bug and nits in the next protocol
negotiation (NPN) functions. r=agl. Modified Files: ssl3ext.c sslsock.c git-svn-id: svn://10.0.0.236/trunk@263560 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
parent
142bddc9ee
commit
bb548cd810
@ -41,7 +41,7 @@
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
/* TLS extension code moved here from ssl3ecc.c */
|
||||
/* $Id: ssl3ext.c,v 1.21 2012-02-15 21:52:08 kaie%kuix.de Exp $ */
|
||||
/* $Id: ssl3ext.c,v 1.22 2012-03-12 19:14:12 wtc%google.com Exp $ */
|
||||
|
||||
#include "nssrenam.h"
|
||||
#include "nss.h"
|
||||
@ -592,10 +592,7 @@ ssl3_ClientHandleNextProtoNegoXtn(sslSocket *ss, PRUint16 ex_type,
|
||||
unsigned char resultBuffer[255];
|
||||
SECItem result = { siBuffer, resultBuffer, 0 };
|
||||
|
||||
if (ss->firstHsDone) {
|
||||
PORT_SetError(SSL_ERROR_NEXT_PROTOCOL_DATA_INVALID);
|
||||
return SECFailure;
|
||||
}
|
||||
PORT_Assert(!ss->firstHsDone);
|
||||
|
||||
rv = ssl3_ValidateNextProtoNego(data->data, data->len);
|
||||
if (rv != SECSuccess)
|
||||
@ -607,6 +604,8 @@ ssl3_ClientHandleNextProtoNegoXtn(sslSocket *ss, PRUint16 ex_type,
|
||||
*/
|
||||
PORT_Assert(ss->nextProtoCallback != NULL);
|
||||
if (!ss->nextProtoCallback) {
|
||||
/* XXX Use a better error code. This is an application error, not an
|
||||
* NSS bug. */
|
||||
PORT_SetError(SEC_ERROR_LIBRARY_FAILURE);
|
||||
return SECFailure;
|
||||
}
|
||||
@ -617,7 +616,7 @@ ssl3_ClientHandleNextProtoNegoXtn(sslSocket *ss, PRUint16 ex_type,
|
||||
return rv;
|
||||
/* If the callback wrote more than allowed to |result| it has corrupted our
|
||||
* stack. */
|
||||
if (result.len > sizeof result) {
|
||||
if (result.len > sizeof resultBuffer) {
|
||||
PORT_SetError(SEC_ERROR_OUTPUT_LEN);
|
||||
return SECFailure;
|
||||
}
|
||||
|
||||
@ -40,7 +40,7 @@
|
||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
/* $Id: sslsock.c,v 1.83 2012-03-11 04:32:35 wtc%google.com Exp $ */
|
||||
/* $Id: sslsock.c,v 1.84 2012-03-12 19:14:12 wtc%google.com Exp $ */
|
||||
#include "seccomon.h"
|
||||
#include "cert.h"
|
||||
#include "keyhi.h"
|
||||
@ -1382,7 +1382,7 @@ SSL_SetNextProtoCallback(PRFileDesc *fd, SSLNextProtoCallback callback,
|
||||
return SECSuccess;
|
||||
}
|
||||
|
||||
/* NextProtoStandardCallback is set as an NPN callback for the case when
|
||||
/* ssl_NextProtoNegoCallback is set as an NPN callback for the case when
|
||||
* SSL_SetNextProtoNego is used.
|
||||
*/
|
||||
static SECStatus
|
||||
@ -1428,12 +1428,12 @@ pick_first:
|
||||
result = ss->opt.nextProtoNego.data;
|
||||
|
||||
found:
|
||||
*protoOutLen = result[0];
|
||||
if (protoMaxLen < result[0]) {
|
||||
PORT_SetError(SEC_ERROR_OUTPUT_LEN);
|
||||
return SECFailure;
|
||||
}
|
||||
memcpy(protoOut, result + 1, result[0]);
|
||||
*protoOutLen = result[0];
|
||||
return SECSuccess;
|
||||
}
|
||||
|
||||
@ -1487,13 +1487,12 @@ SSL_GetNextProto(PRFileDesc *fd, SSLNextProtoState *state, unsigned char *buf,
|
||||
|
||||
if (ss->ssl3.nextProtoState != SSL_NEXT_PROTO_NO_SUPPORT &&
|
||||
ss->ssl3.nextProto.data) {
|
||||
*bufLen = ss->ssl3.nextProto.len;
|
||||
if (*bufLen > bufLenMax) {
|
||||
if (ss->ssl3.nextProto.len > bufLenMax) {
|
||||
PORT_SetError(SEC_ERROR_OUTPUT_LEN);
|
||||
*bufLen = 0;
|
||||
return SECFailure;
|
||||
}
|
||||
PORT_Memcpy(buf, ss->ssl3.nextProto.data, ss->ssl3.nextProto.len);
|
||||
*bufLen = ss->ssl3.nextProto.len;
|
||||
} else {
|
||||
*bufLen = 0;
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user