ruby-changes:34743
From: nobu <ko1@a...>
Date: Tue, 15 Jul 2014 23:59:07 +0900 (JST)
Subject: [ruby-changes:34743] nobu:r46826 (trunk): digest.c: raise exception on init failure
nobu 2014-07-15 23:58:53 +0900 (Tue, 15 Jul 2014) New Revision: 46826 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=46826 Log: digest.c: raise exception on init failure * ext/digest/digest.c: expect digest init and finish functions to indicate success or failure; raise exception on failure. [ruby-core:61614] [Bug #9659] Modified files: trunk/ChangeLog trunk/ext/digest/digest.c trunk/ext/digest/digest.h Index: ChangeLog =================================================================== --- ChangeLog (revision 46825) +++ ChangeLog (revision 46826) @@ -1,3 +1,9 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1 +Tue Jul 15 23:58:59 2014 Jared Jennings <jared.jennings.ctr@u...> + + * ext/digest/digest.c: expect digest init and finish functions to + indicate success or failure; raise exception on failure. + [ruby-core:61614] [Bug #9659] + Tue Jul 15 20:31:40 2014 Masaki Suketa <masaki.suketa@n...> * ext/win32ole/win32ole.c: modify document for WIN32OLE_RECORD. Index: ext/digest/digest.c =================================================================== --- ext/digest/digest.c (revision 46825) +++ ext/digest/digest.c (revision 46826) @@ -521,7 +521,7 @@ get_digest_base_metadata(VALUE klass) https://github.com/ruby/ruby/blob/trunk/ext/digest/digest.c#L521 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) https://github.com/ruby/ruby/blob/trunk/ext/digest/digest.c#L535 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) https://github.com/ruby/ruby/blob/trunk/ext/digest/digest.c#L557 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) https://github.com/ruby/ruby/blob/trunk/ext/digest/digest.c#L595 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) https://github.com/ruby/ruby/blob/trunk/ext/digest/digest.c#L633 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; } Index: ext/digest/digest.h =================================================================== --- ext/digest/digest.h (revision 46825) +++ ext/digest/digest.h (revision 46826) @@ -15,11 +15,11 @@ https://github.com/ruby/ruby/blob/trunk/ext/digest/digest.h#L15 #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; -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/