diff --git a/docs/changelog.md b/docs/changelog.md index 898587fd..eb422482 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -53,6 +53,9 @@ Requires libvips v8.14.0 [#3556](https://github.com/lovell/sharp/pull/3556) [@janaz](https://github.com/janaz) +* Ensure all async JS callbacks are wrapped to help avoid possible race condition. + [#3569](https://github.com/lovell/sharp/issues/3569) + ## v0.31 - *eagle* Requires libvips v8.13.3 diff --git a/src/metadata.cc b/src/metadata.cc index 66bc2cea..67e67e2d 100644 --- a/src/metadata.cc +++ b/src/metadata.cc @@ -145,7 +145,7 @@ class MetadataWorker : public Napi::AsyncWorker { // Handle warnings std::string warning = sharp::VipsWarningPop(); while (!warning.empty()) { - debuglog.Call({ Napi::String::New(env, warning) }); + debuglog.MakeCallback(Receiver().Value(), { Napi::String::New(env, warning) }); warning = sharp::VipsWarningPop(); } diff --git a/src/pipeline.cc b/src/pipeline.cc index 7c0b3cd3..114f95be 100644 --- a/src/pipeline.cc +++ b/src/pipeline.cc @@ -1175,7 +1175,7 @@ class PipelineWorker : public Napi::AsyncWorker { // Handle warnings std::string warning = sharp::VipsWarningPop(); while (!warning.empty()) { - debuglog.Call({ Napi::String::New(env, warning) }); + debuglog.MakeCallback(Receiver().Value(), { Napi::String::New(env, warning) }); warning = sharp::VipsWarningPop(); } @@ -1251,7 +1251,7 @@ class PipelineWorker : public Napi::AsyncWorker { // Decrement processing task counter g_atomic_int_dec_and_test(&sharp::counterProcess); Napi::Number queueLength = Napi::Number::New(env, static_cast(sharp::counterQueue)); - queueListener.Call(Receiver().Value(), { queueLength }); + queueListener.MakeCallback(Receiver().Value(), { queueLength }); } private: @@ -1681,7 +1681,7 @@ Napi::Value pipeline(const Napi::CallbackInfo& info) { // Increment queued task counter g_atomic_int_inc(&sharp::counterQueue); Napi::Number queueLength = Napi::Number::New(info.Env(), static_cast(sharp::counterQueue)); - queueListener.Call(info.This(), { queueLength }); + queueListener.MakeCallback(info.This(), { queueLength }); return info.Env().Undefined(); } diff --git a/src/stats.cc b/src/stats.cc index 735e0ff5..a359319d 100644 --- a/src/stats.cc +++ b/src/stats.cc @@ -106,7 +106,7 @@ class StatsWorker : public Napi::AsyncWorker { // Handle warnings std::string warning = sharp::VipsWarningPop(); while (!warning.empty()) { - debuglog.Call({ Napi::String::New(env, warning) }); + debuglog.MakeCallback(Receiver().Value(), { Napi::String::New(env, warning) }); warning = sharp::VipsWarningPop(); }