Project

General

Profile

Bug #9659 » 001-detect-digest-failure.patch

View differences:

ext/digest/digest.c
Data_Get_Struct(obj, rb_digest_metadata_t, algo);
switch (algo->api_version) {
case 2:
case 3:
break;
/*
......
algo = get_digest_base_metadata(klass);
pctx = xmalloc(algo->ctx_size);
algo->init_func(pctx);
if (algo->init_func(pctx) != 1) {
rb_raise(rb_eRuntimeError, "Digest initialization failed.");
}
obj = Data_Wrap_Struct(klass, 0, xfree, pctx);
......
Data_Get_Struct(self, void, pctx);
algo->init_func(pctx);
if (algo->init_func(pctx) != 1) {
rb_raise(rb_eRuntimeError, "Digest initialization failed.");
}
return self;
}
......
algo->finish_func(pctx, (unsigned char *)RSTRING_PTR(str));
/* avoid potential coredump caused by use of a finished context */
algo->init_func(pctx);
if (algo->init_func(pctx) != 1) {
rb_raise(rb_eRuntimeError, "Digest initialization failed.");
}
return str;
}
ext/digest/digest.h
#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;
(2-2/3)