Crasher fixes and optimizations to jar signature verification. bug=7270 r=norris

git-svn-id: svn://10.0.0.236/trunk@60679 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
mstoltz%netscape.com
2000-02-14 01:57:01 +00:00
parent f8a979601a
commit 4ed4e15d17
8 changed files with 350 additions and 531 deletions

View File

@@ -46,48 +46,18 @@ nsJARInputStream::Available(PRUint32 *_retval)
}
NS_IMETHODIMP
nsJARInputStream::Read(char* buf, PRUint32 count, PRUint32 *_retval)
nsJARInputStream::Read(char* buf, PRUint32 count, PRUint32 *bytesRead)
{
if (mZip == nsnull)
{
*_retval = 0;
*bytesRead = 0;
return NS_OK;
}
if( (mZip->Read(mReadInfo, buf, count, _retval)) != ZIP_OK )
if( (mZip->Read(mReadInfo, buf, count, bytesRead)) != ZIP_OK )
return NS_ERROR_FAILURE;
// Pass the buffer on to the JAR parser
if (mJAR && mJAR->SupportsRSAVerification())
{
nsStringKey key(mEntryName);
nsJARManifestItem* manItem =
(nsJARManifestItem*)mJAR->mManifestData.Get(&key);
if (manItem && !manItem->entryDigestsCalculated)
{
nsresult rv = NS_OK;
if (digestContexts[0] == 0)
for (PRInt32 b=0; b<JAR_DIGEST_COUNT && NS_SUCCEEDED(rv); b++)
rv = mJAR->DigestBegin(&digestContexts[b], b);
for (PRInt32 c=0; c<JAR_DIGEST_COUNT && NS_SUCCEEDED(rv); c++)
rv = mJAR->DigestData(digestContexts[c], buf, *_retval);
if (NS_SUCCEEDED(rv))
{
PRUint32 available;
rv = Available(&available);
if (available == 0)
{
for (PRInt32 d=0; d<JAR_DIGEST_COUNT && NS_SUCCEEDED(rv); d++)
rv = mJAR->CalculateDigest(digestContexts[d],
&(manItem->calculatedEntryDigests[d]));
if (NS_SUCCEEDED(rv))
manItem->entryDigestsCalculated = PR_TRUE;
}
}
return rv;
}
}
return NS_OK;
else
return NS_OK;
}
NS_IMETHODIMP
@@ -103,17 +73,18 @@ nsJARInputStream::Init(nsJAR* aJAR, nsZipArchive* aZip, const char* aFilename)
if (!(aZip && aFilename))
return NS_ERROR_NULL_POINTER;
mZip = aZip;
mJAR = aJAR;
mEntryName = (char*)aFilename;
for (PRInt32 a=0; a<JAR_DIGEST_COUNT; a++)
digestContexts[a] = 0;
PRInt32 result;
result = mZip->ReadInit(mEntryName, &mReadInfo);
if (result != ZIP_OK)
return NS_ERROR_FAILURE;
else
return NS_OK;
// Pass the file (already in memory) on to the JAR parser
if (aJAR)
return aJAR->VerifyEntry(mEntryName, mReadInfo->mFileBuffer,
mReadInfo->mItem->realsize);
return NS_OK;
}
NS_METHOD
@@ -135,7 +106,6 @@ nsJARInputStream::Create(nsISupports* ignored, const nsIID& aIID, void* *aResult
nsJARInputStream::nsJARInputStream()
{
NS_INIT_REFCNT();
mJAR = nsnull;
}
nsJARInputStream::~nsJARInputStream()