Module: wine Branch: master Commit: 75c13b8e5d6737a379799d054607b3807f7448d8 URL: http://source.winehq.org/git/wine.git/?a=commit;h=75c13b8e5d6737a379799d0546...
Author: Juan Lang juan.lang@gmail.com Date: Thu Oct 4 16:12:41 2007 -0700
crypt32: Don't assume a maximum of 32 valid usages.
---
dlls/crypt32/cert.c | 44 +++++++++++++++++++++++++++++++++++++++++--- 1 files changed, 41 insertions(+), 3 deletions(-)
diff --git a/dlls/crypt32/cert.c b/dlls/crypt32/cert.c index 9697ab8..dcad7fa 100644 --- a/dlls/crypt32/cert.c +++ b/dlls/crypt32/cert.c @@ -1922,6 +1922,42 @@ BOOL WINAPI CertRemoveEnhancedKeyUsageIdentifier(PCCERT_CONTEXT pCertContext, return ret; }
+struct BitField +{ + DWORD cIndexes; + DWORD *indexes; +}; + +#define BITS_PER_DWORD (sizeof(DWORD) * 8) + +static void CRYPT_SetBitInField(struct BitField *field, DWORD bit) +{ + DWORD indexIndex = bit / BITS_PER_DWORD; + + if (indexIndex + 1 > field->cIndexes) + { + if (field->cIndexes) + field->indexes = CryptMemRealloc(field->indexes, + (indexIndex + 1) * sizeof(DWORD)); + else + field->indexes = CryptMemAlloc(sizeof(DWORD)); + if (field->indexes) + field->cIndexes = indexIndex + 1; + } + if (field->indexes) + field->indexes[indexIndex] |= 1 << (bit % BITS_PER_DWORD); +} + +static BOOL CRYPT_IsBitInFieldSet(struct BitField *field, DWORD bit) +{ + BOOL set = FALSE; + DWORD indexIndex = bit / BITS_PER_DWORD; + + assert(field->cIndexes); + set = field->indexes[indexIndex] & (1 << (bit % BITS_PER_DWORD)); + return set; +} + BOOL WINAPI CertGetValidUsages(DWORD cCerts, PCCERT_CONTEXT *rghCerts, int *cNumOIDs, LPSTR *rghOIDs, DWORD *pcbOIDs) { @@ -1978,7 +2014,8 @@ BOOL WINAPI CertGetValidUsages(DWORD cCerts, PCCERT_CONTEXT *rghCerts, } else { - DWORD j, k, validIndexes = 0, numRemoved = 0; + struct BitField validIndexes = { 0, NULL }; + DWORD j, k, numRemoved = 0;
/* Merge: build a bitmap of all the indexes of * validUsages.rgpszUsageIdentifier that are in pUsage. @@ -1990,7 +2027,7 @@ BOOL WINAPI CertGetValidUsages(DWORD cCerts, PCCERT_CONTEXT *rghCerts, if (!strcmp(pUsage->rgpszUsageIdentifier[j], validUsages.rgpszUsageIdentifier[k])) { - validIndexes |= (1 << k); + CRYPT_SetBitInField(&validIndexes, k); break; } } @@ -2000,7 +2037,7 @@ BOOL WINAPI CertGetValidUsages(DWORD cCerts, PCCERT_CONTEXT *rghCerts, */ for (j = 0; j < validUsages.cUsageIdentifier; j++) { - if (!(validIndexes & (1 << j))) + if (!CRYPT_IsBitInFieldSet(&validIndexes, j)) { if (j < validUsages.cUsageIdentifier - 1) { @@ -2019,6 +2056,7 @@ BOOL WINAPI CertGetValidUsages(DWORD cCerts, PCCERT_CONTEXT *rghCerts, validUsages.cUsageIdentifier--; } } + CryptMemFree(validIndexes.indexes); } } CryptMemFree(pUsage);