从节点扩展返回具有缓冲区句柄的对象

时间:2014-03-21 12:59:28

标签: javascript c++ node.js

当编写node.js扩展时,如何安全地返回一个安全地具有node :: Buffer属性的对象,这样他们就不会在之后收集垃圾。

从我的node-sodium库中提取代码,lib钠到节点的端口。

#define NEW_BUFFER_AND_PTR(name, size) \
  Buffer* name = Buffer::New(size); \
  unsigned char* name ## _ptr = (unsigned char*)Buffer::Data(name)

Handle<Value> bind_crypto_sign_keypair(const Arguments& args) {
  HandleScope scope;

  NEW_BUFFER_AND_PTR(vk, crypto_sign_PUBLICKEYBYTES);
  NEW_BUFFER_AND_PTR(sk, crypto_sign_SECRETKEYBYTES);

  if( crypto_sign_keypair(vk_ptr, sk_ptr) == 0) {
    Handle<Object> result = Object::New();
    result->Set(String::NewSymbol("publicKey"), vk->handle_);
    result->Set(String::NewSymbol("secretKey"), sk->handle_);
    return scope.Close(result);
  }
  return scope.Close(Undefined());
}

此函数创建一组用于签名的公钥和密钥。 在Javascript中我做

var keys = binding.crypto_sign_keypair();
console.out(keys.publicKey);
console.out(keys.secretKey);

这样可行,但有时会运行垃圾收集并且缓冲区变为无效,我得到的只是堆栈转储和以输出开头的崩溃:

#
# Fatal error in ../deps/v8/src/api.h, line 297
# CHECK(allow_empty_handle || that != __null) failed
#


==== Stack trace ============================================

Security context: 0x2190c4706b71 <JS Object>#0#

任何帮助都将非常感谢!

0 个答案:

没有答案