laverdet / isolated-vm

Secure & isolated JS environments for nodejs
ISC License
2.14k stars 152 forks source link

npm install isolated-vm fails on google compute instance #118

Closed RichoDemus closed 5 years ago

RichoDemus commented 5 years ago

Hi, I'm trying to install isolated-vm on a google compute instance but it fails

richodemus@reader:~/screeps$ node -v
v10.16.0
richodemus@reader:~/screeps$ npm -v
6.9.0
richodemus@reader:~/screeps$ npm install isolated-vm

> isolated-vm@2.0.0 install /home/richodemus/screeps/node_modules/isolated-vm
> node-gyp rebuild --release -j 4

make: Entering directory '/home/richodemus/screeps/node_modules/isolated-vm/build'
  CXX(target) Release/obj.target/nortti/src/external_copy_nortti.o
In file included from ../src/isolate/remote_handle.h:3:0,
                 from ../src/isolate/util.h:6,
                 from ../src/external_copy.h:10,
                 from ../src/external_copy_nortti.cc:1:
../src/isolate/environment.h:330:33: warning: missing initializer for member ‘v8::StartupData::data’ [-Wmissing-field-initializers]
   v8::StartupData startup_data {};
                                 ^
../src/isolate/environment.h:330:33: warning: missing initializer for member ‘v8::StartupData::raw_size’ [-Wmissing-field-initializers]
  AR(target) Release/obj.target/nortti.a
  COPY Release/nortti.a
  CXX(target) Release/obj.target/isolated_vm/src/isolate/holder.o
  CXX(target) Release/obj.target/isolated_vm/src/isolate/environment.o
  CXX(target) Release/obj.target/isolated_vm/src/isolate/class_handle.o
  CXX(target) Release/obj.target/isolated_vm/src/isolate/allocator.o
In file included from ../src/isolate/holder.cc:2:0:
../src/isolate/environment.h:330:33: warning: missing initializer for member ‘v8::StartupData::data’ [-Wmissing-field-initializers]
   v8::StartupData startup_data {};
                                 ^
../src/isolate/environment.h:330:33: warning: missing initializer for member ‘v8::StartupData::raw_size’ [-Wmissing-field-initializers]
In file included from ../src/isolate/remote_handle.h:3:0,
                 from ../src/isolate/util.h:6,
                 from ../src/isolate/convert_param.h:3,
                 from ../src/isolate/class_handle.h:4,
                 from ../src/isolate/class_handle.cc:1:
../src/isolate/environment.h:330:33: warning: missing initializer for member ‘v8::StartupData::data’ [-Wmissing-field-initializers]
   v8::StartupData startup_data {};
                                 ^
../src/isolate/environment.h:330:33: warning: missing initializer for member ‘v8::StartupData::raw_size’ [-Wmissing-field-initializers]
In file included from ../src/isolate/allocator.cc:2:0:
../src/isolate/environment.h:330:33: warning: missing initializer for member ‘v8::StartupData::data’ [-Wmissing-field-initializers]
   v8::StartupData startup_data {};
                                 ^
../src/isolate/environment.h:330:33: warning: missing initializer for member ‘v8::StartupData::raw_size’ [-Wmissing-field-initializers]
../src/isolate/holder.cc: In member function ‘void ivm::IsolateHolder::Dispose()’:
../src/isolate/holder.cc:14:102: error: no matching function for call to ‘atomic_exchange(std::shared_ptr<ivm::IsolateEnvironment>*, std::shared_ptr<ivm::IsolateEnvironment>)’
  shared_ptr<IsolateEnvironment> tmp = std::atomic_exchange(&isolate, shared_ptr<IsolateEnvironment>());
                                                                                                      ^
../src/isolate/holder.cc:14:102: note: candidates are:
In file included from ../src/isolate/environment.h:8:0,
                 from ../src/isolate/holder.cc:2:
/usr/include/c++/4.9/atomic:914:5: note: template<class _ITp> _ITp std::atomic_exchange(std::atomic<_ITp>*, _ITp)
     atomic_exchange(atomic<_ITp>* __a, _ITp __i) noexcept
     ^
/usr/include/c++/4.9/atomic:914:5: note:   template argument deduction/substitution failed:
../src/isolate/holder.cc:14:102: note:   ‘std::shared_ptr<ivm::IsolateEnvironment>’ is not derived from ‘std::atomic<_ITp>’
  shared_ptr<IsolateEnvironment> tmp = std::atomic_exchange(&isolate, shared_ptr<IsolateEnvironment>());
                                                                                                      ^
In file included from ../src/isolate/environment.h:8:0,
                 from ../src/isolate/holder.cc:2:
/usr/include/c++/4.9/atomic:919:5: note: template<class _ITp> _ITp std::atomic_exchange(volatile std::atomic<_ITp>*, _ITp)
     atomic_exchange(volatile atomic<_ITp>* __a, _ITp __i) noexcept
     ^
/usr/include/c++/4.9/atomic:919:5: note:   template argument deduction/substitution failed:
../src/isolate/holder.cc:14:102: note:   ‘std::shared_ptr<ivm::IsolateEnvironment>’ is not derived from ‘volatile std::atomic<_ITp>’
  shared_ptr<IsolateEnvironment> tmp = std::atomic_exchange(&isolate, shared_ptr<IsolateEnvironment>());
                                                                                                      ^
../src/isolate/holder.cc: In member function ‘std::shared_ptr<ivm::IsolateEnvironment> ivm::IsolateHolder::GetIsolate()’:
../src/isolate/holder.cc:24:34: error: no matching function for call to ‘atomic_load(std::shared_ptr<ivm::IsolateEnvironment>*)’
  return std::atomic_load(&isolate);
                                  ^
../src/isolate/holder.cc:24:34: note: candidates are:
In file included from ../src/isolate/environment.h:8:0,
                 from ../src/isolate/holder.cc:2:
/usr/include/c++/4.9/atomic:904:5: note: template<class _ITp> _ITp std::atomic_load(const std::atomic<_ITp>*)
     atomic_load(const atomic<_ITp>* __a) noexcept
     ^
/usr/include/c++/4.9/atomic:904:5: note:   template argument deduction/substitution failed:
../src/isolate/holder.cc:24:34: note:   ‘std::shared_ptr<ivm::IsolateEnvironment>’ is not derived from ‘const std::atomic<_ITp>’
  return std::atomic_load(&isolate);
                                  ^
In file included from ../src/isolate/environment.h:8:0,
                 from ../src/isolate/holder.cc:2:
/usr/include/c++/4.9/atomic:909:5: note: template<class _ITp> _ITp std::atomic_load(const volatile std::atomic<_ITp>*)
     atomic_load(const volatile atomic<_ITp>* __a) noexcept
     ^
/usr/include/c++/4.9/atomic:909:5: note:   template argument deduction/substitution failed:
../src/isolate/holder.cc:24:34: note:   ‘std::shared_ptr<ivm::IsolateEnvironment>’ is not derived from ‘const volatile std::atomic<_ITp>’
  return std::atomic_load(&isolate);
                                  ^
../src/isolate/holder.cc: In member function ‘void ivm::IsolateHolder::ScheduleTask(std::unique_ptr<ivm::Runnable>, bool, bool, bool)’:
../src/isolate/holder.cc:28:64: error: no matching function for call to ‘atomic_load(std::shared_ptr<ivm::IsolateEnvironment>*)’
  shared_ptr<IsolateEnvironment> ref = std::atomic_load(&isolate);
                                                                ^
../src/isolate/holder.cc:28:64: note: candidates are:
In file included from ../src/isolate/environment.h:8:0,
                 from ../src/isolate/holder.cc:2:
/usr/include/c++/4.9/atomic:904:5: note: template<class _ITp> _ITp std::atomic_load(const std::atomic<_ITp>*)
     atomic_load(const atomic<_ITp>* __a) noexcept
     ^
/usr/include/c++/4.9/atomic:904:5: note:   template argument deduction/substitution failed:
../src/isolate/holder.cc:28:64: note:   ‘std::shared_ptr<ivm::IsolateEnvironment>’ is not derived from ‘const std::atomic<_ITp>’
  shared_ptr<IsolateEnvironment> ref = std::atomic_load(&isolate);
                                                                ^
In file included from ../src/isolate/environment.h:8:0,
                 from ../src/isolate/holder.cc:2:
/usr/include/c++/4.9/atomic:909:5: note: template<class _ITp> _ITp std::atomic_load(const volatile std::atomic<_ITp>*)
     atomic_load(const volatile atomic<_ITp>* __a) noexcept
     ^
/usr/include/c++/4.9/atomic:909:5: note:   template argument deduction/substitution failed:
../src/isolate/holder.cc:28:64: note:   ‘std::shared_ptr<ivm::IsolateEnvironment>’ is not derived from ‘const volatile std::atomic<_ITp>’
  shared_ptr<IsolateEnvironment> ref = std::atomic_load(&isolate);
                                                                ^
In file included from ../src/isolate/environment.cc:1:0:
../src/isolate/environment.h:330:33: warning: missing initializer for member ‘v8::StartupData::data’ [-Wmissing-field-initializers]
   v8::StartupData startup_data {};
                                 ^
../src/isolate/environment.h:330:33: warning: missing initializer for member ‘v8::StartupData::raw_size’ [-Wmissing-field-initializers]
../src/isolate/holder.cc: In member function ‘std::shared_ptr<ivm::IsolateEnvironment> ivm::IsolateHolder::GetIsolate()’:
../src/isolate/holder.cc:25:1: warning: control reaches end of non-void function [-Wreturn-type]
 }
 ^
isolated_vm.target.mk:126: recipe for target 'Release/obj.target/isolated_vm/src/isolate/holder.o' failed
make: *** [Release/obj.target/isolated_vm/src/isolate/holder.o] Error 1
make: *** Waiting for unfinished jobs....
make: Leaving directory '/home/richodemus/screeps/node_modules/isolated-vm/build'
gyp ERR! build error
gyp ERR! stack Error: `make` failed with exit code: 2
gyp ERR! stack     at ChildProcess.onExit (/home/richodemus/node-v10.16.0-linux-x64/lib/node_modules/npm/node_modules/node-gyp/lib/build.js:262:23)
gyp ERR! stack     at ChildProcess.emit (events.js:198:13)
gyp ERR! stack     at Process.ChildProcess._handle.onexit (internal/child_process.js:248:12)
gyp ERR! System Linux 3.16.0-5-amd64
gyp ERR! command "/home/richodemus/node-v10.16.0-linux-x64/bin/node" "/home/richodemus/node-v10.16.0-linux-x64/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js" "rebuild" "--release" "-j" "4"
gyp ERR! cwd /home/richodemus/screeps/node_modules/isolated-vm
gyp ERR! node -v v10.16.0
gyp ERR! node-gyp -v v3.8.0
gyp ERR! not ok
npm WARN enoent ENOENT: no such file or directory, open '/home/richodemus/screeps/package.json'
npm WARN screeps No description
npm WARN screeps No repository field.
npm WARN screeps No README data
npm WARN screeps No license field.

npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! isolated-vm@2.0.0 install: `node-gyp rebuild --release -j 4`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the isolated-vm@2.0.0 install script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /home/richodemus/.npm/_logs/2019-07-11T15_40_22_131Z-debug.log
laverdet commented 5 years ago

This is because you're running Ubuntu Xenial.

Can you apply the following diff and let me know if it compiles for you?

diff --git a/src/isolate/holder.cc b/src/isolate/holder.cc
index f00796d..8b99920 100644
--- a/src/isolate/holder.cc
+++ b/src/isolate/holder.cc
@@ -1,7 +1,7 @@
 #include "holder.h"
 #include "environment.h"
 #include "util.h"
-#include <atomic>
+#include <utility>

 using std::shared_ptr;
 using std::unique_ptr;
@@ -11,7 +11,11 @@ namespace ivm {
 IsolateHolder::IsolateHolder(shared_ptr<IsolateEnvironment> isolate) : isolate(std::move(isolate)) {}

 void IsolateHolder::Dispose() {
-       shared_ptr<IsolateEnvironment> tmp = std::atomic_exchange(&isolate, shared_ptr<IsolateEnvironment>());
+       shared_ptr<IsolateEnvironment> tmp;
+       {
+               std::lock_guard<std::mutex> lock{mutex};
+               tmp = std::exchange(isolate, {});
+       }
        if (tmp) {
                tmp->Terminate();
                tmp.reset();
@@ -21,11 +25,16 @@ void IsolateHolder::Dispose() {
 }

 shared_ptr<IsolateEnvironment> IsolateHolder::GetIsolate() {
-       return std::atomic_load(&isolate);
+       std::lock_guard<std::mutex> lock{mutex};
+       return isolate;
 }

 void IsolateHolder::ScheduleTask(unique_ptr<Runnable> task, bool run_inline, bool wake_isolate, bool handle_task) {
-       shared_ptr<IsolateEnvironment> ref = std::atomic_load(&isolate);
+       shared_ptr<IsolateEnvironment> ref;
+       {
+               std::lock_guard<std::mutex> lock{mutex};
+               ref = isolate;
+       }
        if (ref) {
                if (run_inline && IsolateEnvironment::GetCurrent() == ref.get()) {
                        task->Run();
diff --git a/src/isolate/holder.h b/src/isolate/holder.h
index e709201..4dd493c 100644
--- a/src/isolate/holder.h
+++ b/src/isolate/holder.h
@@ -1,5 +1,6 @@
 #pragma once
 #include "runnable.h"
+#include <mutex>
 #include <memory>

 namespace ivm {
@@ -9,6 +10,7 @@ class IsolateHolder {
        friend class IsolateEnvironment;
        private:
                std::shared_ptr<IsolateEnvironment> isolate;
+               std::mutex mutex;

        public:
                explicit IsolateHolder(std::shared_ptr<IsolateEnvironment> isolate);