X-Git-Url: https://git.saurik.com/apple/security.git/blobdiff_plain/80e2389990082500d76eb566d4946be3e786c3ef..d8f41ccd20de16f8ebe2ccc84d47bf1cb2b26bbb:/SecurityTests/clxutils/threadTest/mdsLookupThr.cpp?ds=sidebyside diff --git a/SecurityTests/clxutils/threadTest/mdsLookupThr.cpp b/SecurityTests/clxutils/threadTest/mdsLookupThr.cpp new file mode 100644 index 00000000..a0d6a691 --- /dev/null +++ b/SecurityTests/clxutils/threadTest/mdsLookupThr.cpp @@ -0,0 +1,173 @@ +/* MDS per-thread basher */ +#include +#include +#include "testParams.h" +#include + +/* for malloc debug */ +#define DO_PAUSE 0 + +using namespace Security; + +/* most of this is cribbed from cspxutils/mdsLookup/ */ + +/* free attribute(s) allocated by MDS */ +static void freeAttrs( + CSSM_DB_RECORD_ATTRIBUTE_DATA_PTR recordAttrs) +{ + unsigned i; + + for(i=0; iNumberOfAttributes; i++) { + CSSM_DB_ATTRIBUTE_DATA_PTR attrData = &recordAttrs->AttributeData[i]; + if(attrData == NULL) { + /* fault of caller, who allocated the CSSM_DB_ATTRIBUTE_DATA */ + printf("***freeAttrs screwup: NULL attrData\n"); + return; + } + unsigned j; + for(j=0; jNumberOfValues; j++) { + CSSM_DATA_PTR data = &attrData->Value[j]; + if(data == NULL) { + /* fault of MDS, who said there was a value here */ + printf("***freeAttrs screwup: NULL data\n"); + return; + } + /* we're using cdsa_client, what's the appFree equivalent? */ + free(data->Data); + data->Data = NULL; + data->Length = 0; + } + free(attrData->Value); + attrData->Value = NULL; + } +} + +static int doLookup( + MDSClient::Directory &mds, + + /* Record type, a.k.a. Relation, e.g. MDS_CDSADIR_CSP_PRIMARY_RECORDTYPE */ + CSSM_DB_RECORDTYPE recordType, + + /* key, value, valForm, and valOp are the thing we search on */ + /* Note CSSM_DB_ATTRIBUTE_NAME_FORMAT - the format of the attribute name - + * is always CSSM_DB_ATTRIBUTE_NAME_AS_STRING for MDS. */ + const char *key, // e.g. "AlgType" + const void *valPtr, + unsigned valLen, + CSSM_DB_ATTRIBUTE_FORMAT valForm, // CSSM_DB_ATTRIBUTE_FORMAT_STRING, etc. + CSSM_DB_OPERATOR valOp) // normally CSSM_DB_EQUAL +{ + CSSM_QUERY query; + CSSM_DB_UNIQUE_RECORD_PTR record = NULL; + CSSM_HANDLE resultHand; + CSSM_DB_RECORD_ATTRIBUTE_DATA recordAttrs; + CSSM_SELECTION_PREDICATE predicate; + CSSM_DATA predData; + CSSM_DB_ATTRIBUTE_DATA outAttr; + CSSM_DB_ATTRIBUTE_INFO_PTR attrInfo; + const char *attrName = "ModuleID"; + + /* We want one attribute back, name and format specified by caller */ + recordAttrs.DataRecordType = recordType; + recordAttrs.SemanticInformation = 0; + recordAttrs.NumberOfAttributes = 1; + recordAttrs.AttributeData = &outAttr; + + memset(&outAttr, 0, sizeof(CSSM_DB_ATTRIBUTE_DATA)); + attrInfo = &outAttr.Info; + attrInfo->AttributeNameFormat = CSSM_DB_ATTRIBUTE_NAME_AS_STRING; + attrInfo->Label.AttributeName = (char *)attrName; + attrInfo->AttributeFormat = CSSM_DB_ATTRIBUTE_FORMAT_STRING; + + /* one predicate - the caller's key and CSSM_DB_OPERATOR */ + predicate.DbOperator = valOp; + predicate.Attribute.Info.AttributeNameFormat = CSSM_DB_ATTRIBUTE_NAME_AS_STRING; + predicate.Attribute.Info.Label.AttributeName = (char *)key; + predicate.Attribute.Info.AttributeFormat = valForm; + predData.Data = (uint8 *)valPtr; + predData.Length = valLen; + predicate.Attribute.Value = &predData; + predicate.Attribute.NumberOfValues = 1; + + query.RecordType = recordType; + query.Conjunctive = CSSM_DB_NONE; + query.NumSelectionPredicates = 1; + query.SelectionPredicate = &predicate; + query.QueryLimits.TimeLimit = 0; // FIXME - meaningful? + query.QueryLimits.SizeLimit = 1; // FIXME - meaningful? + query.QueryFlags = 0; // CSSM_QUERY_RETURN_DATA...FIXME - used? + + /* until this API settles down bag this test */ + #if 0 + printf("doLookup: mds.dlGetFirst unstable' skipping!\n"); + return -1; + #else + try { + /* 8A268 has this */ + #if 0 + resultHand = mds.dlGetFirst(query, recordAttrs, record); + #else + /* TOT */ + resultHand = mds.dlGetFirst(query, recordAttrs, NULL, record); + #endif + } + catch(...) { + printf("doLookup: dlGetFirst threw exception!\n"); + return -1; + } + #endif + if(resultHand == 0) { + printf("doLookup: no record found\n"); + return -1; + } + + /* we could examine the record here of we wanted to */ + mds.dlFreeUniqueId(record); + freeAttrs(&recordAttrs); + mds.dlAbortQuery(resultHand); + return 0; +} + +/* nothing here for now */ +int mdsLookupInit(TestParams *tp) +{ + return 0; +} + +int mdsLookup(TestParams *testParams) +{ + for(unsigned loopNum=0; loopNumnumLoops; loopNum++) { + if(testParams->verbose) { + printf("mdsLookup loop %d\n", loopNum); + } + else if(!testParams->quiet) { + printChar(testParams->progressChar); + } + try { + MDSClient::Directory &mds = MDSClient::mds(); + uint32 val = CSSM_ALGID_SHA1; + if(doLookup(mds, MDS_CDSADIR_CSP_CAPABILITY_RECORDTYPE, + "AlgType", &val, sizeof(uint32), + CSSM_DB_ATTRIBUTE_FORMAT_UINT32, CSSM_DB_EQUAL)) { + printf("***thread %u aborting\n", testParams->threadNum); + return -1; + } + } + catch(CssmError &err) { + cssmPerror("MDS init", err.error); + printf("mdsLookup: MDSClient::mds() threw CssmError!\n"); + return -1; + } + catch(...) { + printf("mdsLookup: MDSClient::mds() threw exception!\n"); + return -1; + } + #if DO_PAUSE + fpurge(stdin); + printf("Hit CR to continue: "); + getchar(); + #endif + } + return 0; +} +