From 163cb5b43de68cef7ae4fa053d710098399d1359 Mon Sep 17 00:00:00 2001 From: nobu Date: Sat, 4 Oct 2014 23:33:15 +0000 Subject: openssl: typed data git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@47799 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ext/openssl/ossl_bn.c | 23 +++++++++++++++++++++-- ext/openssl/ossl_cipher.c | 27 ++++++++++++++++++++++----- 2 files changed, 43 insertions(+), 7 deletions(-) (limited to 'ext') diff --git a/ext/openssl/ossl_bn.c b/ext/openssl/ossl_bn.c index 2528f1c089..0af7d63944 100644 --- a/ext/openssl/ossl_bn.c +++ b/ext/openssl/ossl_bn.c @@ -15,11 +15,11 @@ if (!(bn)) { \ ossl_raise(rb_eRuntimeError, "BN wasn't initialized!"); \ } \ - (obj) = Data_Wrap_Struct((klass), 0, BN_clear_free, (bn)); \ + (obj) = TypedData_Wrap_Struct((klass), &ossl_bn_type, (bn)); \ } while (0) #define GetBN(obj, bn) do { \ - Data_Get_Struct((obj), BIGNUM, (bn)); \ + TypedData_Get_Struct((obj), BIGNUM, &ossl_bn_type, (bn)); \ if (!(bn)) { \ ossl_raise(rb_eRuntimeError, "BN wasn't initialized!"); \ } \ @@ -30,6 +30,25 @@ GetBN((obj), (bn)); \ } while (0) +static void +ossl_bn_free(void *ptr) +{ + BN_clear_free(ptr); +} + +static size_t +ossl_bn_size(const void *ptr) +{ + return sizeof(BIGNUM); +} + +static const rb_data_type_t ossl_bn_type = { + "OpenSSL/BN", + {0, ossl_bn_free, ossl_bn_size,}, + NULL, NULL, + RUBY_TYPED_FREE_IMMEDIATELY, +}; + /* * Classes */ diff --git a/ext/openssl/ossl_cipher.c b/ext/openssl/ossl_cipher.c index 1cd185e69c..0efadd1925 100644 --- a/ext/openssl/ossl_cipher.c +++ b/ext/openssl/ossl_cipher.c @@ -11,13 +11,13 @@ #include "ossl.h" #define WrapCipher(obj, klass, ctx) \ - (obj) = Data_Wrap_Struct((klass), 0, ossl_cipher_free, (ctx)) + (obj) = TypedData_Wrap_Struct((klass), &ossl_cipher_type, (ctx)) #define MakeCipher(obj, klass, ctx) \ - (obj) = Data_Make_Struct((klass), EVP_CIPHER_CTX, 0, ossl_cipher_free, (ctx)) + (obj) = TypedData_Make_Struct((klass), EVP_CIPHER_CTX, &ossl_cipher_type, (ctx)) #define AllocCipher(obj, ctx) \ - memset(DATA_PTR(obj) = (ctx) = ALLOC(EVP_CIPHER_CTX), 0, sizeof(EVP_CIPHER_CTX)) + (DATA_PTR(obj) = (ctx) = ZALLOC(EVP_CIPHER_CTX)) #define GetCipherInit(obj, ctx) do { \ - Data_Get_Struct((obj), EVP_CIPHER_CTX, (ctx)); \ + TypedData_Get_Struct((obj), EVP_CIPHER_CTX, &ossl_cipher_type, (ctx)); \ } while (0) #define GetCipher(obj, ctx) do { \ GetCipherInit((obj), (ctx)); \ @@ -37,6 +37,15 @@ VALUE cCipher; VALUE eCipherError; static VALUE ossl_cipher_alloc(VALUE klass); +static void ossl_cipher_free(void *ptr); +static size_t ossl_cipher_memsize(const void *ptr); + +static const rb_data_type_t ossl_cipher_type = { + "OpenSSL/Cipher", + {0, ossl_cipher_free, ossl_cipher_memsize,}, + NULL, NULL, + RUBY_TYPED_FREE_IMMEDIATELY, +}; /* * PUBLIC @@ -70,14 +79,22 @@ ossl_cipher_new(const EVP_CIPHER *cipher) * PRIVATE */ static void -ossl_cipher_free(EVP_CIPHER_CTX *ctx) +ossl_cipher_free(void *ptr) { + EVP_CIPHER_CTX *ctx = ptr; if (ctx) { EVP_CIPHER_CTX_cleanup(ctx); ruby_xfree(ctx); } } +static size_t +ossl_cipher_memsize(const void *ptr) +{ + const EVP_CIPHER_CTX *ctx = ptr; + return ctx ? sizeof(*ctx) : 0; +} + static VALUE ossl_cipher_alloc(VALUE klass) { -- cgit v1.2.3