a99c193cf2
Currently, when calling `copyFileOut`, the original extension from the file is lost, and a generic `*.tmp` is added instead. This becomes problematic in the scenario where we use `child_process.execFile` on a Windows Batch script that lives inside the `asar` package. Windows relies on the extension being present in order to interpret the script accordingly, which results in the following bug because the operating system doesn't know what do to with this `*.tmp` file: ``` Error: spawn UNKNOWN ``` Steps to reproduce: 1. Create a dummy batch script (test.bat): ``` @echo off echo "Hello world" ``` 2. Create an electron app that attemps to call this script with `child_process.execFile`: ```js var child_process = require('child_process'); var path = require('path'); child_process.execFile(path.join(__dirname, 'test.bat'), function(error, stdout) { if (error) throw error; console.log(stdout); }); ``` 3. Package this small application as an asar archive: ```sh > asar pack mytestapp app.asar ``` 4. Execute the application: ```sh > electron.exe app.asar ```
43 lines
1.2 KiB
C++
43 lines
1.2 KiB
C++
// Copyright (c) 2014 GitHub, Inc.
|
|
// Use of this source code is governed by the MIT license that can be
|
|
// found in the LICENSE file.
|
|
|
|
#ifndef ATOM_COMMON_ASAR_SCOPED_TEMPORARY_FILE_H_
|
|
#define ATOM_COMMON_ASAR_SCOPED_TEMPORARY_FILE_H_
|
|
|
|
#include "base/files/file_path.h"
|
|
|
|
namespace base {
|
|
class File;
|
|
}
|
|
|
|
namespace asar {
|
|
|
|
// An object representing a temporary file that should be cleaned up when this
|
|
// object goes out of scope. Note that since deletion occurs during the
|
|
// destructor, no further error handling is possible if the directory fails to
|
|
// be deleted. As a result, deletion is not guaranteed by this class.
|
|
class ScopedTemporaryFile {
|
|
public:
|
|
ScopedTemporaryFile();
|
|
virtual ~ScopedTemporaryFile();
|
|
|
|
// Init an empty temporary file with a certain extension.
|
|
bool Init(const base::FilePath::StringType ext);
|
|
|
|
// Init an temporary file and fill it with content of |path|.
|
|
bool InitFromFile(base::File* src,
|
|
const base::FilePath::StringType ext,
|
|
uint64 offset, uint64 size);
|
|
|
|
base::FilePath path() const { return path_; }
|
|
|
|
private:
|
|
base::FilePath path_;
|
|
|
|
DISALLOW_COPY_AND_ASSIGN(ScopedTemporaryFile);
|
|
};
|
|
|
|
} // namespace asar
|
|
|
|
#endif // ATOM_COMMON_ASAR_SCOPED_TEMPORARY_FILE_H_
|