[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]