From e1f1159d4aad301cd6c451e3cb1e02d70b6c0bc0 Mon Sep 17 00:00:00 2001 From: "serge%netscape.com" Date: Thu, 25 Apr 2002 21:28:06 +0000 Subject: [PATCH] fix 130080 [Signing Acrobat doesn't work] r=peterl, sr=darin --- modules/plugin/base/src/nsIPluginHost.h | 3 +- modules/plugin/base/src/nsPluginHostImpl.cpp | 100 +++++++++++++------ 2 files changed, 72 insertions(+), 31 deletions(-) diff --git a/modules/plugin/base/src/nsIPluginHost.h b/modules/plugin/base/src/nsIPluginHost.h index b5e83d62a11..f44d54f8f1f 100644 --- a/modules/plugin/base/src/nsIPluginHost.h +++ b/modules/plugin/base/src/nsIPluginHost.h @@ -147,7 +147,8 @@ NS_NewPluginPostDataStream(nsIInputStream **result, file, PR_RDONLY, 0600, - nsIFileInputStream::DELETE_ON_CLOSE)) + nsIFileInputStream::DELETE_ON_CLOSE | + nsIFileInputStream::CLOSE_ON_EOF)) ) { // wrap the file stream with a buffered input stream diff --git a/modules/plugin/base/src/nsPluginHostImpl.cpp b/modules/plugin/base/src/nsPluginHostImpl.cpp index a4ac35381aa..b9e9fa0918d 100644 --- a/modules/plugin/base/src/nsPluginHostImpl.cpp +++ b/modules/plugin/base/src/nsPluginHostImpl.cpp @@ -5853,14 +5853,15 @@ nsresult nsPluginHostImpl::NewEmbededPluginStream(nsIURI* aURL, nsIPluginInstanceOwner *aOwner, nsIPluginInstance* aInstance) { + if (!aURL) + return NS_OK; + nsPluginStreamListenerPeer *listener = (nsPluginStreamListenerPeer *)new nsPluginStreamListenerPeer(); if (listener == nsnull) return NS_ERROR_OUT_OF_MEMORY; nsresult rv; - if (!aURL) - return NS_OK; // if we have an instance, everything has been set up // 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); + // delete listener, don't leak it + if (NS_FAILED(rv)) + delete listener; } //NS_RELEASE(aURL); @@ -6329,6 +6333,7 @@ nsPluginHostImpl::ParsePostBufferToFixHeaders( return NS_ERROR_FAILURE; } p += headersLen; + newBufferLen = headersLen + dataLen; } // at this point we've done with headers. // 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; nsXPIDLCString filename; // stat file == get size & convert file:///c:/ to c: if needed - nsCOMPtr file = do_CreateInstance(NS_LOCAL_FILE_CONTRACTID, &rv); + nsCOMPtr inFile = do_CreateInstance(NS_LOCAL_FILE_CONTRACTID, &rv); if (NS_FAILED(rv) || - (NS_FAILED(rv = NS_InitFileFromURLSpec(file, nsDependentCString(postDataURL))) && - NS_FAILED(rv = file->InitWithPath(postDataURL))) || - NS_FAILED(rv = file->GetFileSize(&fileSize)) || - NS_FAILED(rv = file->GetPath(getter_Copies(filename))) + (NS_FAILED(rv = NS_InitFileFromURLSpec(inFile, nsDependentCString(postDataURL))) && + NS_FAILED(rv = inFile->InitWithPath(postDataURL))) || + NS_FAILED(rv = inFile->GetFileSize(&fileSize)) || + NS_FAILED(rv = inFile->GetPath(getter_Copies(filename))) ) return rv; if (!LL_IS_ZERO(fileSize)) { nsCOMPtr inStream; - rv = NS_NewLocalFileInputStream(getter_AddRefs(inStream), file); + rv = NS_NewLocalFileInputStream(getter_AddRefs(inStream), inFile); if (NS_FAILED(rv)) return rv; // Create a temporary file to write the http Content-length: %ld\r\n\" header // and "\r\n" == end of headers for post data to nsCOMPtr tempFile; - nsresult rv; rv = NS_GetSpecialDirectory(NS_OS_TEMP_DIR, getter_AddRefs(tempFile)); - if (tempFile) { - tempFile->Append("pluginpost"); - // mode is 0600 so that it's not world-readable - rv = tempFile->CreateUnique(nsIFile::NORMAL_FILE_TYPE, 0600); - } + if (NS_FAILED(rv)) + return rv; + + 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 outStream; if (NS_SUCCEEDED(rv)) { 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 } NS_ASSERTION(NS_SUCCEEDED(rv), "Post data file couldn't be created!"); - 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; - + if (NS_FAILED(rv)) + return rv; + char buf[1024]; + PRUint32 br, bw; + PRBool firstRead = PR_TRUE; while (1) { // Read() mallocs if buffer is null 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; rv = outStream->Write(buf, bw, &br); - if (NS_FAILED(rv) || (bw != br)) break; + if (NS_FAILED(rv) || (bw != br)) + break; } + inStream->Close(); outStream->Close(); if (NS_SUCCEEDED(rv)) { - nsXPIDLCString tempFileName; - tempFile->GetPath(getter_Copies(tempFileName)); - *pTmpFileName = PL_strdup(tempFileName); + tempFile->GetPath(pTmpFileName); } } return rv;