mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 1088969
- Upgrade Mozilla 36 to use NSS 3.18 - NSS_3_18_BETA2
This commit is contained in:
parent
018f4f611d
commit
75427f88c8
@ -1 +1 @@
|
||||
NSS_3_18_BETA1
|
||||
NSS_3_18_BETA2
|
||||
|
@ -10,3 +10,4 @@
|
||||
*/
|
||||
|
||||
#error "Do not include this header file."
|
||||
|
||||
|
@ -183,7 +183,16 @@ nss_builtins_FindObjectsInit
|
||||
NSSArena *arena;
|
||||
NSSCKMDFindObjects *rv = (NSSCKMDFindObjects *)NULL;
|
||||
struct builtinsFOStr *fo = (struct builtinsFOStr *)NULL;
|
||||
builtinsInternalObject **temp = (builtinsInternalObject **)NULL;
|
||||
|
||||
/*
|
||||
* 99% of the time we get 0 or 1 matches. So we start with a small
|
||||
* stack-allocated array to hold the matches and switch to a heap-allocated
|
||||
* array later if the number of matches exceeds STACK_BUF_LENGTH.
|
||||
*/
|
||||
#define STACK_BUF_LENGTH 1
|
||||
builtinsInternalObject *stackTemp[STACK_BUF_LENGTH];
|
||||
builtinsInternalObject **temp = stackTemp;
|
||||
PRBool tempIsHeapAllocated = PR_FALSE;
|
||||
PRUint32 i;
|
||||
|
||||
arena = NSSArena_Create();
|
||||
@ -211,17 +220,24 @@ nss_builtins_FindObjectsInit
|
||||
rv->Next = builtins_mdFindObjects_Next;
|
||||
rv->null = (void *)NULL;
|
||||
|
||||
temp = nss_ZNEWARRAY((NSSArena *)NULL, builtinsInternalObject *,
|
||||
nss_builtins_nObjects);
|
||||
if( (builtinsInternalObject **)NULL == temp ) {
|
||||
*pError = CKR_HOST_MEMORY;
|
||||
goto loser;
|
||||
}
|
||||
|
||||
for( i = 0; i < nss_builtins_nObjects; i++ ) {
|
||||
builtinsInternalObject *o = (builtinsInternalObject *)&nss_builtins_data[i];
|
||||
|
||||
if( CK_TRUE == builtins_match(pTemplate, ulAttributeCount, o) ) {
|
||||
if( fo->n == STACK_BUF_LENGTH ) {
|
||||
/* Switch from the small stack array to a heap-allocated array large
|
||||
* enough to handle matches in all remaining cases. */
|
||||
temp = nss_ZNEWARRAY((NSSArena *)NULL, builtinsInternalObject *,
|
||||
fo->n + nss_builtins_nObjects - i);
|
||||
if( (builtinsInternalObject **)NULL == temp ) {
|
||||
*pError = CKR_HOST_MEMORY;
|
||||
goto loser;
|
||||
}
|
||||
tempIsHeapAllocated = PR_TRUE;
|
||||
(void)nsslibc_memcpy(temp, stackTemp,
|
||||
sizeof(builtinsInternalObject *) * fo->n);
|
||||
}
|
||||
|
||||
temp[ fo->n ] = o;
|
||||
fo->n++;
|
||||
}
|
||||
@ -234,13 +250,17 @@ nss_builtins_FindObjectsInit
|
||||
}
|
||||
|
||||
(void)nsslibc_memcpy(fo->objs, temp, sizeof(builtinsInternalObject *) * fo->n);
|
||||
nss_ZFreeIf(temp);
|
||||
temp = (builtinsInternalObject **)NULL;
|
||||
if (tempIsHeapAllocated) {
|
||||
nss_ZFreeIf(temp);
|
||||
temp = (builtinsInternalObject **)NULL;
|
||||
}
|
||||
|
||||
return rv;
|
||||
|
||||
loser:
|
||||
nss_ZFreeIf(temp);
|
||||
if (tempIsHeapAllocated) {
|
||||
nss_ZFreeIf(temp);
|
||||
}
|
||||
nss_ZFreeIf(fo);
|
||||
nss_ZFreeIf(rv);
|
||||
if ((NSSArena *)NULL != arena) {
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -45,8 +45,8 @@
|
||||
* of the comment in the CK_VERSION type definition.
|
||||
*/
|
||||
#define NSS_BUILTINS_LIBRARY_VERSION_MAJOR 2
|
||||
#define NSS_BUILTINS_LIBRARY_VERSION_MINOR 1
|
||||
#define NSS_BUILTINS_LIBRARY_VERSION "2.1"
|
||||
#define NSS_BUILTINS_LIBRARY_VERSION_MINOR 2
|
||||
#define NSS_BUILTINS_LIBRARY_VERSION "2.2"
|
||||
|
||||
/* These version numbers detail the semantic changes to the ckfw engine. */
|
||||
#define NSS_BUILTINS_HARDWARE_VERSION_MAJOR 1
|
||||
|
@ -16,55 +16,110 @@
|
||||
*/
|
||||
|
||||
static unsigned char* definite_length_decoder(const unsigned char *buf,
|
||||
const unsigned int length,
|
||||
unsigned int *data_length,
|
||||
const unsigned int buf_length,
|
||||
unsigned int *out_data_length,
|
||||
PRBool includeTag)
|
||||
{
|
||||
unsigned char tag;
|
||||
unsigned int used_length= 0;
|
||||
unsigned int data_len;
|
||||
unsigned int used_length = 0;
|
||||
unsigned int data_length = 0;
|
||||
unsigned char length_field_len = 0;
|
||||
unsigned char byte;
|
||||
unsigned int i;
|
||||
|
||||
if (used_length >= length)
|
||||
if (used_length >= buf_length)
|
||||
{
|
||||
/* Tag field was not found! */
|
||||
return NULL;
|
||||
}
|
||||
tag = buf[used_length++];
|
||||
|
||||
/* blow out when we come to the end */
|
||||
if (tag == 0)
|
||||
{
|
||||
/* End-of-contents octects should not be present in DER because
|
||||
DER doesn't use the indefinite length form. */
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (used_length >= length)
|
||||
if ((tag & 0x1F) == 0x1F)
|
||||
{
|
||||
/* High tag number (a tag number > 30) is not supported */
|
||||
return NULL;
|
||||
}
|
||||
data_len = buf[used_length++];
|
||||
|
||||
if (data_len&0x80)
|
||||
if (used_length >= buf_length)
|
||||
{
|
||||
int len_count = data_len & 0x7f;
|
||||
/* Length field was not found! */
|
||||
return NULL;
|
||||
}
|
||||
byte = buf[used_length++];
|
||||
|
||||
data_len = 0;
|
||||
|
||||
while (len_count-- > 0)
|
||||
if (!(byte & 0x80))
|
||||
{
|
||||
/* Short form: The high bit is not set. */
|
||||
data_length = byte; /* clarity; we're returning a 32-bit int. */
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Long form. Extract the field length */
|
||||
length_field_len = byte & 0x7F;
|
||||
if (length_field_len == 0)
|
||||
{
|
||||
if (used_length >= length)
|
||||
/* DER doesn't use the indefinite length form. */
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (length_field_len > sizeof(data_length))
|
||||
{
|
||||
/* We don't support an extended length field longer than
|
||||
4 bytes (2^32) */
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (length_field_len > (buf_length - used_length))
|
||||
{
|
||||
/* Extended length field was not found */
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Iterate across the extended length field */
|
||||
for (i = 0; i < length_field_len; i++)
|
||||
{
|
||||
byte = buf[used_length++];
|
||||
data_length = (data_length << 8) | byte;
|
||||
|
||||
if (i == 0)
|
||||
{
|
||||
return NULL;
|
||||
PRBool too_long = PR_FALSE;
|
||||
if (length_field_len == 1)
|
||||
{
|
||||
too_long = ((byte & 0x80) == 0); /* Short form suffices */
|
||||
}
|
||||
else
|
||||
{
|
||||
too_long = (byte == 0); /* This zero byte can be omitted */
|
||||
}
|
||||
if (too_long)
|
||||
{
|
||||
/* The length is longer than needed. */
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
data_len = (data_len << 8) | buf[used_length++];
|
||||
}
|
||||
}
|
||||
|
||||
if (data_len > (length-used_length) )
|
||||
if (data_length > (buf_length - used_length))
|
||||
{
|
||||
/* The decoded length exceeds the available buffer */
|
||||
return NULL;
|
||||
}
|
||||
if (includeTag) data_len += used_length;
|
||||
|
||||
*data_length = data_len;
|
||||
if (includeTag)
|
||||
{
|
||||
data_length += used_length;
|
||||
}
|
||||
|
||||
*out_data_length = data_length;
|
||||
return ((unsigned char*)buf + (includeTag ? 0 : used_length));
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user