Chromium Code Reviews| Index: services/nacl/content_handler_main.cc |
| diff --git a/services/nacl/content_handler_main.cc b/services/nacl/content_handler_main.cc |
| index 776ebd85ec3c0277ce6583f6406c25ec68f35ea2..238c6bf40da5c3f31ed10ff40d65a82dd59f5dd5 100644 |
| --- a/services/nacl/content_handler_main.cc |
| +++ b/services/nacl/content_handler_main.cc |
| @@ -2,7 +2,6 @@ |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| -#include "base/files/file_path.h" |
| #include "base/files/file_util.h" |
| #include "base/message_loop/message_loop.h" |
| #include "build/build_config.h" |
| @@ -24,24 +23,8 @@ namespace nacl { |
| namespace content_handler { |
| namespace { |
| -bool URLResponseToTempFile(mojo::URLResponsePtr& response, |
| - base::FilePath* file_path) { |
| - if (!base::CreateTemporaryFile(file_path)) { |
| - return false; |
| - } |
| - |
| - if (!mojo::common::BlockingCopyToFile(response->body.Pass(), *file_path)) { |
| - base::DeleteFile(*file_path, false); |
| - return false; |
| - } |
| - |
| - // TODO(ncbray): can we ensure temp file deletion even if we crash? |
| - return true; |
| -} |
| - |
| -bool TempFileForURL(mojo::URLLoaderPtr& url_loader, |
| - const GURL& url, |
| - base::FilePath* path) { |
| +FILE* TempFileForURL(mojo::URLLoaderPtr& url_loader, |
| + const GURL& url) { |
|
Mark Seaborn
2015/09/02 18:46:45
Nit: Fix indentation. Fits on previous line?
You
Sean Klein
2015/09/02 21:49:11
Done.
|
| mojo::URLRequestPtr request(mojo::URLRequest::New()); |
| request->url = url.spec(); |
| request->method = "GET"; |
| @@ -61,22 +44,10 @@ bool TempFileForURL(mojo::URLLoaderPtr& url_loader, |
| LOG(ERROR) << "could not load " << url.spec() << " (" |
| << response->error->code << ") " |
| << response->error->description.get().c_str(); |
| - return false; |
| + return NULL; |
| } |
| - return URLResponseToTempFile(response, path); |
| -} |
| - |
| -NaClDesc* NaClDescFromNexePath(base::FilePath& path) { |
| - base::File file(path, base::File::FLAG_OPEN | base::File::FLAG_READ | |
| - base::File::FLAG_EXECUTE); |
| - if (!file.IsValid()) { |
| - LOG(FATAL) << "failed to open " << path.value(); |
| - } |
| - // Note: potentially unsafe, assumes the file is immutable. This should be |
| - // OK because we're currently only using temp files. |
| - return NaClDescCreateWithFilePathMetadata(file.TakePlatformFile(), |
| - path.AsUTF8Unsafe().c_str()); |
| + return mojo::common::BlockingCopyToTempFile(response->body.Pass()); |
| } |
| } // namespace |
| @@ -109,8 +80,8 @@ class NaClContentHandler : public mojo::ApplicationDelegate, |
| LOG(FATAL) << "Cannot resolve IRT URL"; |
| } |
| - if (!TempFileForURL(url_loader, irt_url, &irt_path_)) { |
| - LOG(FATAL) << "Could not aquire the IRT"; |
| + if ((irt_fp_ = TempFileForURL(url_loader, irt_url)) == NULL) { |
|
Mark Seaborn
2015/09/02 18:46:45
I'd prefer using two lines for this, to avoid doin
Sean Klein
2015/09/02 21:49:11
Done.
|
| + LOG(FATAL) << "Could not acquire the IRT"; |
| } |
| } |
| @@ -128,33 +99,53 @@ class NaClContentHandler : public mojo::ApplicationDelegate, |
| // Needed to use Mojo interfaces on this thread. |
| base::MessageLoop loop(mojo::common::MessagePumpMojo::Create()); |
| - // Aquire the nexe. |
| - base::FilePath nexe_path; |
| - if (!URLResponseToTempFile(response, &nexe_path)) { |
| + // Acquire the nexe. |
| + FILE* nexe_fp = mojo::common::BlockingCopyToTempFile( |
| + response->body.Pass()); |
| + if (nexe_fp == NULL) { |
| LOG(FATAL) << "could not redirect nexe to temp file"; |
| } |
| - // Aquire the IRT. |
| + // Acquire the IRT. |
| mojo::URLLoaderPtr url_loader = url_loader_.Pass(); |
| LoadIRT(url_loader); |
| // Get file handles to the IRT and nexe. |
| - NaClDesc* irt_desc = NaClDescFromNexePath(irt_path_); |
| - NaClDesc* nexe_desc = NaClDescFromNexePath(nexe_path); |
| + int irt_fd = fileno(irt_fp_); |
|
Mark Seaborn
2015/09/02 18:46:45
It looks like you could combine:
fileno() + dup()
Sean Klein
2015/09/02 21:49:11
Done.
|
| + if (irt_fd == -1) { |
| + LOG(FATAL) << "Could not open the irt stream pointer's file descriptor"; |
| + } |
| + int nexe_fd = fileno(nexe_fp); |
| + if (nexe_fd == -1) { |
| + LOG(FATAL) << "Could not open the nexe stream pointer's file descriptor"; |
| + } |
| + |
| + // These file descriptors must be dup'd, since NaClDesc takes ownership |
| + // of the file descriptor. The descriptor is still needed to close |
| + // the file stream. |
| + if ((irt_fd = dup(irt_fd)) == -1) { |
| + LOG(FATAL) << "Could not dup the irt file descriptor"; |
| + } |
| + if ((nexe_fd = dup(nexe_fd)) == -1) { |
| + LOG(FATAL) << "Could not dup the nexe file descriptor"; |
| + } |
| + |
| + NaClDesc* irt_desc = NaClDescCreateWithFilePathMetadata( |
| + irt_fd, ""); |
| + NaClDesc* nexe_desc = NaClDescCreateWithFilePathMetadata( |
| + nexe_fd, ""); |
| // Run. |
| int exit_code = mojo::LaunchNaCl( |
| nexe_desc, irt_desc, 0, NULL, |
| application_request.PassMessagePipe().release().value()); |
| - // TODO(ncbray): are the file handles actually closed at this point? |
| - |
| // Clean up. |
| - if (!base::DeleteFile(irt_path_, false)) { |
| - LOG(FATAL) << "Failed to remove irt temp file " << irt_path_.value(); |
| + if (fclose(irt_fp_)) { |
|
Mark Seaborn
2015/09/02 18:46:45
Nit: you could do this before LaunchNaCl()
Sean Klein
2015/09/02 21:49:11
Done.
|
| + LOG(FATAL) << "Failed to close irt temp file"; |
| } |
| - if (!base::DeleteFile(nexe_path, false)) { |
| - LOG(FATAL) << "Failed to remove nexe temp file " << nexe_path.value(); |
| + if (fclose(nexe_fp)) { |
| + LOG(FATAL) << "Failed to close nexe temp file"; |
| } |
| // Exits the process cleanly, does not return. |
| @@ -164,7 +155,7 @@ class NaClContentHandler : public mojo::ApplicationDelegate, |
| mojo::ContentHandlerFactory content_handler_factory_; |
| GURL url_; |
| - base::FilePath irt_path_; |
| + FILE* irt_fp_; |
| mojo::URLLoaderPtr url_loader_; |