当编写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#
任何帮助都将非常感谢!