mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
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] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@46826 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
a3f50234bc
commit
6046b9f149
3 changed files with 21 additions and 7 deletions
|
@ -1,3 +1,9 @@
|
|||
Tue Jul 15 23:58:59 2014 Jared Jennings <jared.jennings.ctr@us.af.mil>
|
||||
|
||||
* 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@nifty.ne.jp>
|
||||
|
||||
* ext/win32ole/win32ole.c: modify document for WIN32OLE_RECORD.
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Reference in a new issue