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:
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user