summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorwtchang%redhat.com <devnull@localhost>2006-12-06 21:52:56 +0000
committerwtchang%redhat.com <devnull@localhost>2006-12-06 21:52:56 +0000
commitca157cfb4707d2e23aa221414a0e050059a85499 (patch)
tree4a262b70c5fff9ae8a433c202124c83667cd2893
parent177f00e139115d22835ec72f36562dd192100210 (diff)
downloadnss-hg-ca157cfb4707d2e23aa221414a0e050059a85499.tar.gz
Bugzilla Bug 342795: the call-once functions need to store the error code
on failure so that the error code can be retrieved later. r=nelsonb and alexei.volkov. Tag: NSS_3_11_BRANCH
-rw-r--r--security/nss/lib/ssl/ssl3ecc.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/security/nss/lib/ssl/ssl3ecc.c b/security/nss/lib/ssl/ssl3ecc.c
index a4c0f9da8..71762873d 100644
--- a/security/nss/lib/ssl/ssl3ecc.c
+++ b/security/nss/lib/ssl/ssl3ecc.c
@@ -222,7 +222,7 @@ static const Bits2Curve bits2curve [] = {
typedef struct ECDHEKeyPairStr {
ssl3KeyPair * pair;
- PRInt32 flag;
+ int error; /* error code of the call-once function */
PRCallOnceType once;
} ECDHEKeyPair;
@@ -550,9 +550,12 @@ ssl3_ShutdownECDHECurves(void *appData, void *nssData)
static PRStatus
ssl3_ECRegister(void)
{
- SECStatus rv;
- rv = NSS_RegisterShutdown(ssl3_ShutdownECDHECurves, gECDHEKeyPairs);
- return (PRStatus)rv;
+ SECStatus rv;
+ rv = NSS_RegisterShutdown(ssl3_ShutdownECDHECurves, gECDHEKeyPairs);
+ if (rv != SECSuccess) {
+ gECDHEKeyPairs[ec_noName].error = PORT_GetError();
+ }
+ return (PRStatus)rv;
}
/* CallOnce function, called once for each named curve. */
@@ -569,6 +572,7 @@ ssl3_CreateECDHEphemeralKeyPair(void * arg)
/* ok, no one has generated a global key for this curve yet, do so */
if (ecName2params(NULL, ec_curve, &ecParams) != SECSuccess) {
+ gECDHEKeyPairs[ec_curve].error = PORT_GetError();
return PR_FAILURE;
}
@@ -583,6 +587,7 @@ ssl3_CreateECDHEphemeralKeyPair(void * arg)
SECKEY_DestroyPublicKey(pubKey);
}
ssl_MapLowLevelError(SEC_ERROR_KEYGEN_FAIL);
+ gECDHEKeyPairs[ec_curve].error = PORT_GetError();
return PR_FAILURE;
}
@@ -610,12 +615,14 @@ ssl3_CreateECDHEphemeralKeys(sslSocket *ss, ECName ec_curve)
status = PR_CallOnce(&gECDHEKeyPairs[ec_noName].once, ssl3_ECRegister);
if (status != PR_SUCCESS) {
+ PORT_SetError(gECDHEKeyPairs[ec_noName].error);
return SECFailure;
}
status = PR_CallOnceWithArg(&gECDHEKeyPairs[ec_curve].once,
ssl3_CreateECDHEphemeralKeyPair,
(void *)ec_curve);
if (status != PR_SUCCESS) {
+ PORT_SetError(gECDHEKeyPairs[ec_curve].error);
return SECFailure;
}
}