aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--ext/digest/digest.c16
-rw-r--r--ext/digest/digest.h6
3 files changed, 21 insertions, 7 deletions
diff --git a/ChangeLog b/ChangeLog
index 1ede55e5ff..6f1b0fe2c2 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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.
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;