diff options
Diffstat (limited to 'ext/digest')
-rw-r--r-- | ext/digest/digest.c | 16 | ||||
-rw-r--r-- | ext/digest/digest.h | 6 |
2 files changed, 15 insertions, 7 deletions
diff --git a/ext/digest/digest.c b/ext/digest/digest.c index f1592f4725..2231452c42 100644 --- a/ext/digest/digest.c +++ b/ext/digest/digest.c @@ -521,7 +521,7 @@ get_digest_base_metadata(VALUE klass) Data_Get_Struct(obj, rb_digest_metadata_t, algo); switch (algo->api_version) { - case 2: + case 3: break; /* @@ -535,6 +535,14 @@ get_digest_base_metadata(VALUE klass) return algo; } +static inline void +algo_init(const rb_digest_metadata_t *algo, void *pctx) +{ + if (algo->init_func(pctx) != 1) { + rb_raise(rb_eRuntimeError, "Digest initialization failed."); + } +} + static VALUE rb_digest_base_alloc(VALUE klass) { @@ -549,7 +557,7 @@ rb_digest_base_alloc(VALUE klass) algo = get_digest_base_metadata(klass); pctx = xmalloc(algo->ctx_size); - algo->init_func(pctx); + algo_init(algo, pctx); obj = Data_Wrap_Struct(klass, 0, xfree, pctx); @@ -587,7 +595,7 @@ rb_digest_base_reset(VALUE self) Data_Get_Struct(self, void, pctx); - algo->init_func(pctx); + algo_init(algo, pctx); return self; } @@ -625,7 +633,7 @@ rb_digest_base_finish(VALUE self) algo->finish_func(pctx, (unsigned char *)RSTRING_PTR(str)); /* avoid potential coredump caused by use of a finished context */ - algo->init_func(pctx); + algo_init(algo, pctx); return str; } diff --git a/ext/digest/digest.h b/ext/digest/digest.h index 6e4906c859..85848d5682 100644 --- a/ext/digest/digest.h +++ b/ext/digest/digest.h @@ -15,11 +15,11 @@ #include "ruby.h" -#define RUBY_DIGEST_API_VERSION 2 +#define RUBY_DIGEST_API_VERSION 3 -typedef void (*rb_digest_hash_init_func_t)(void *); +typedef int (*rb_digest_hash_init_func_t)(void *); typedef void (*rb_digest_hash_update_func_t)(void *, unsigned char *, size_t); -typedef void (*rb_digest_hash_finish_func_t)(void *, unsigned char *); +typedef int (*rb_digest_hash_finish_func_t)(void *, unsigned char *); typedef struct { int api_version; |