зеркало из https://github.com/mozilla/pjs.git
fix 130080 [Signing Acrobat doesn't work] r=peterl, sr=darin
This commit is contained in:
Родитель
8bf4676d16
Коммит
e1f1159d4a
|
@ -147,7 +147,8 @@ NS_NewPluginPostDataStream(nsIInputStream **result,
|
||||||
file,
|
file,
|
||||||
PR_RDONLY,
|
PR_RDONLY,
|
||||||
0600,
|
0600,
|
||||||
nsIFileInputStream::DELETE_ON_CLOSE))
|
nsIFileInputStream::DELETE_ON_CLOSE |
|
||||||
|
nsIFileInputStream::CLOSE_ON_EOF))
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
// wrap the file stream with a buffered input stream
|
// wrap the file stream with a buffered input stream
|
||||||
|
|
|
@ -5853,14 +5853,15 @@ nsresult nsPluginHostImpl::NewEmbededPluginStream(nsIURI* aURL,
|
||||||
nsIPluginInstanceOwner *aOwner,
|
nsIPluginInstanceOwner *aOwner,
|
||||||
nsIPluginInstance* aInstance)
|
nsIPluginInstance* aInstance)
|
||||||
{
|
{
|
||||||
|
if (!aURL)
|
||||||
|
return NS_OK;
|
||||||
|
|
||||||
nsPluginStreamListenerPeer *listener = (nsPluginStreamListenerPeer *)new nsPluginStreamListenerPeer();
|
nsPluginStreamListenerPeer *listener = (nsPluginStreamListenerPeer *)new nsPluginStreamListenerPeer();
|
||||||
if (listener == nsnull)
|
if (listener == nsnull)
|
||||||
return NS_ERROR_OUT_OF_MEMORY;
|
return NS_ERROR_OUT_OF_MEMORY;
|
||||||
|
|
||||||
nsresult rv;
|
nsresult rv;
|
||||||
|
|
||||||
if (!aURL)
|
|
||||||
return NS_OK;
|
|
||||||
|
|
||||||
// if we have an instance, everything has been set up
|
// if we have an instance, everything has been set up
|
||||||
// if we only have an owner, then we need to pass it in
|
// if we only have an owner, then we need to pass it in
|
||||||
|
@ -5884,6 +5885,9 @@ nsresult nsPluginHostImpl::NewEmbededPluginStream(nsIURI* aURL,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
rv = NS_OpenURI(listener, nsnull, aURL, nsnull, loadGroup);
|
rv = NS_OpenURI(listener, nsnull, aURL, nsnull, loadGroup);
|
||||||
|
// delete listener, don't leak it
|
||||||
|
if (NS_FAILED(rv))
|
||||||
|
delete listener;
|
||||||
}
|
}
|
||||||
|
|
||||||
//NS_RELEASE(aURL);
|
//NS_RELEASE(aURL);
|
||||||
|
@ -6329,6 +6333,7 @@ nsPluginHostImpl::ParsePostBufferToFixHeaders(
|
||||||
return NS_ERROR_FAILURE;
|
return NS_ERROR_FAILURE;
|
||||||
}
|
}
|
||||||
p += headersLen;
|
p += headersLen;
|
||||||
|
newBufferLen = headersLen + dataLen;
|
||||||
}
|
}
|
||||||
// at this point we've done with headers.
|
// at this point we've done with headers.
|
||||||
// there is a possibility that input buffer has only headers info in it
|
// there is a possibility that input buffer has only headers info in it
|
||||||
|
@ -6352,29 +6357,49 @@ nsPluginHostImpl::CreateTmpFileToPost(const char *postDataURL, char **pTmpFileNa
|
||||||
PRInt64 fileSize;
|
PRInt64 fileSize;
|
||||||
nsXPIDLCString filename;
|
nsXPIDLCString filename;
|
||||||
// stat file == get size & convert file:///c:/ to c: if needed
|
// stat file == get size & convert file:///c:/ to c: if needed
|
||||||
nsCOMPtr<nsILocalFile> file = do_CreateInstance(NS_LOCAL_FILE_CONTRACTID, &rv);
|
nsCOMPtr<nsILocalFile> inFile = do_CreateInstance(NS_LOCAL_FILE_CONTRACTID, &rv);
|
||||||
if (NS_FAILED(rv) ||
|
if (NS_FAILED(rv) ||
|
||||||
(NS_FAILED(rv = NS_InitFileFromURLSpec(file, nsDependentCString(postDataURL))) &&
|
(NS_FAILED(rv = NS_InitFileFromURLSpec(inFile, nsDependentCString(postDataURL))) &&
|
||||||
NS_FAILED(rv = file->InitWithPath(postDataURL))) ||
|
NS_FAILED(rv = inFile->InitWithPath(postDataURL))) ||
|
||||||
NS_FAILED(rv = file->GetFileSize(&fileSize)) ||
|
NS_FAILED(rv = inFile->GetFileSize(&fileSize)) ||
|
||||||
NS_FAILED(rv = file->GetPath(getter_Copies(filename)))
|
NS_FAILED(rv = inFile->GetPath(getter_Copies(filename)))
|
||||||
)
|
)
|
||||||
return rv;
|
return rv;
|
||||||
if (!LL_IS_ZERO(fileSize)) {
|
if (!LL_IS_ZERO(fileSize)) {
|
||||||
nsCOMPtr<nsIInputStream> inStream;
|
nsCOMPtr<nsIInputStream> inStream;
|
||||||
rv = NS_NewLocalFileInputStream(getter_AddRefs(inStream), file);
|
rv = NS_NewLocalFileInputStream(getter_AddRefs(inStream), inFile);
|
||||||
if (NS_FAILED(rv)) return rv;
|
if (NS_FAILED(rv)) return rv;
|
||||||
|
|
||||||
// Create a temporary file to write the http Content-length: %ld\r\n\" header
|
// Create a temporary file to write the http Content-length: %ld\r\n\" header
|
||||||
// and "\r\n" == end of headers for post data to
|
// and "\r\n" == end of headers for post data to
|
||||||
nsCOMPtr<nsIFile> tempFile;
|
nsCOMPtr<nsIFile> tempFile;
|
||||||
nsresult rv;
|
|
||||||
rv = NS_GetSpecialDirectory(NS_OS_TEMP_DIR, getter_AddRefs(tempFile));
|
rv = NS_GetSpecialDirectory(NS_OS_TEMP_DIR, getter_AddRefs(tempFile));
|
||||||
if (tempFile) {
|
if (NS_FAILED(rv))
|
||||||
tempFile->Append("pluginpost");
|
return rv;
|
||||||
// mode is 0600 so that it's not world-readable
|
|
||||||
rv = tempFile->CreateUnique(nsIFile::NORMAL_FILE_TYPE, 0600);
|
rv = tempFile->Append(kPluginTmpDirName);
|
||||||
}
|
if (NS_FAILED(rv))
|
||||||
|
return rv;
|
||||||
|
|
||||||
|
PRBool dirExists;
|
||||||
|
tempFile->Exists(&dirExists);
|
||||||
|
if (!dirExists)
|
||||||
|
(void) tempFile->Create(nsIFile::DIRECTORY_TYPE, 0600);
|
||||||
|
|
||||||
|
nsXPIDLCString inFileName;
|
||||||
|
inFile->GetLeafName(getter_Copies(inFileName));
|
||||||
|
nsCAutoString tempFileName("post-");
|
||||||
|
tempFileName += inFileName;
|
||||||
|
rv = tempFile->Append(tempFileName.get());
|
||||||
|
|
||||||
|
if (NS_FAILED(rv))
|
||||||
|
return rv;
|
||||||
|
|
||||||
|
// make it unique, and mode == 0600, not world-readable
|
||||||
|
rv = tempFile->CreateUnique(nsIFile::NORMAL_FILE_TYPE, 0600);
|
||||||
|
if (NS_FAILED(rv))
|
||||||
|
return rv;
|
||||||
|
|
||||||
nsCOMPtr<nsIOutputStream> outStream;
|
nsCOMPtr<nsIOutputStream> outStream;
|
||||||
if (NS_SUCCEEDED(rv)) {
|
if (NS_SUCCEEDED(rv)) {
|
||||||
rv = NS_NewLocalFileOutputStream(getter_AddRefs(outStream),
|
rv = NS_NewLocalFileOutputStream(getter_AddRefs(outStream),
|
||||||
|
@ -6383,32 +6408,47 @@ nsPluginHostImpl::CreateTmpFileToPost(const char *postDataURL, char **pTmpFileNa
|
||||||
0600); // 600 so others can't read our form data
|
0600); // 600 so others can't read our form data
|
||||||
}
|
}
|
||||||
NS_ASSERTION(NS_SUCCEEDED(rv), "Post data file couldn't be created!");
|
NS_ASSERTION(NS_SUCCEEDED(rv), "Post data file couldn't be created!");
|
||||||
if (NS_FAILED(rv)) return rv;
|
if (NS_FAILED(rv))
|
||||||
|
return rv;
|
||||||
PRInt32 contentLen = nsInt64(fileSize);
|
|
||||||
char p[128];
|
|
||||||
sprintf(p, "Content-length: %ld\r\n\r\n",contentLen);
|
|
||||||
PRUint32 bw = 0, br= 0;
|
|
||||||
rv = outStream->Write(p, bw = PL_strlen(p), &br) ||
|
|
||||||
bw != br ? NS_ERROR_FAILURE : NS_OK;
|
|
||||||
NS_ASSERTION(NS_SUCCEEDED(rv), "Failed to write Post data into tmp file!");
|
|
||||||
if (NS_FAILED(rv)) return rv;
|
|
||||||
|
|
||||||
char buf[1024];
|
char buf[1024];
|
||||||
|
PRUint32 br, bw;
|
||||||
|
PRBool firstRead = PR_TRUE;
|
||||||
while (1) {
|
while (1) {
|
||||||
// Read() mallocs if buffer is null
|
// Read() mallocs if buffer is null
|
||||||
rv = inStream->Read(buf, 1024, &br);
|
rv = inStream->Read(buf, 1024, &br);
|
||||||
if (NS_FAILED(rv) || (PRInt32)br <= 0) break;
|
if (NS_FAILED(rv) || (PRInt32)br <= 0)
|
||||||
|
break;
|
||||||
|
if (firstRead) {
|
||||||
|
// according to the 4.x spec
|
||||||
|
// http://developer.netscape.com/docs/manuals/communicator/plugin/pgfn2.htm#1007707
|
||||||
|
//"For protocols in which the headers must be distinguished from the body,
|
||||||
|
// such as HTTP, the buffer or file should contain the headers, followed by
|
||||||
|
// a blank line, then the body. If no custom headers are required, simply
|
||||||
|
// add a blank line ('\n') to the beginning of the file or buffer.
|
||||||
|
|
||||||
|
char *parsedBuf;
|
||||||
|
// assuming first 1K (or what we got) has all headers in,
|
||||||
|
// lets parse it through nsPluginHostImpl::ParsePostBufferToFixHeaders()
|
||||||
|
ParsePostBufferToFixHeaders((const char *)buf, br, &parsedBuf, &bw);
|
||||||
|
rv = outStream->Write(parsedBuf, bw, &br);
|
||||||
|
nsMemory::Free(parsedBuf);
|
||||||
|
if (NS_FAILED(rv) || (bw != br))
|
||||||
|
break;
|
||||||
|
|
||||||
|
firstRead = PR_FALSE;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
bw = br;
|
bw = br;
|
||||||
rv = outStream->Write(buf, bw, &br);
|
rv = outStream->Write(buf, bw, &br);
|
||||||
if (NS_FAILED(rv) || (bw != br)) break;
|
if (NS_FAILED(rv) || (bw != br))
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
inStream->Close();
|
inStream->Close();
|
||||||
outStream->Close();
|
outStream->Close();
|
||||||
if (NS_SUCCEEDED(rv)) {
|
if (NS_SUCCEEDED(rv)) {
|
||||||
nsXPIDLCString tempFileName;
|
tempFile->GetPath(pTmpFileName);
|
||||||
tempFile->GetPath(getter_Copies(tempFileName));
|
|
||||||
*pTmpFileName = PL_strdup(tempFileName);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return rv;
|
return rv;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче