diff options
author | Kazuki Yamaguchi <k@rhe.jp> | 2016-08-07 18:09:52 +0900 |
---|---|---|
committer | Kazuki Yamaguchi <k@rhe.jp> | 2016-08-09 16:34:13 +0900 |
commit | 3292933e67790dddfc28dcaba3ed08c066216d40 (patch) | |
tree | 97112b15c3a90ac3a45f1198039d5127e9b6c6b9 /ext/openssl/ossl_digest.c | |
parent | e9496bed5c37e5efcd73b3015369123ebaf4d8e8 (diff) | |
download | ruby-openssl-3292933e67790dddfc28dcaba3ed08c066216d40.tar.gz |
digest: check return value of EVP_Digest{Update,Final_ex}
Their return type was void in ancient versions of OpenSSL but no longer.
Diffstat (limited to 'ext/openssl/ossl_digest.c')
-rw-r--r-- | ext/openssl/ossl_digest.c | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/ext/openssl/ossl_digest.c b/ext/openssl/ossl_digest.c index 317083fe..f9451220 100644 --- a/ext/openssl/ossl_digest.c +++ b/ext/openssl/ossl_digest.c @@ -203,7 +203,9 @@ ossl_digest_update(VALUE self, VALUE data) StringValue(data); GetDigest(self, ctx); - EVP_DigestUpdate(ctx, RSTRING_PTR(data), RSTRING_LEN(data)); + + if (!EVP_DigestUpdate(ctx, RSTRING_PTR(data), RSTRING_LEN(data))) + ossl_raise(eDigestError, "EVP_DigestUpdate"); return self; } @@ -218,19 +220,21 @@ ossl_digest_finish(int argc, VALUE *argv, VALUE self) { EVP_MD_CTX *ctx; VALUE str; - - rb_scan_args(argc, argv, "01", &str); + int out_len; GetDigest(self, ctx); + rb_scan_args(argc, argv, "01", &str); + out_len = EVP_MD_CTX_size(ctx); if (NIL_P(str)) { - str = rb_str_new(NULL, EVP_MD_CTX_size(ctx)); + str = rb_str_new(NULL, out_len); } else { StringValue(str); - rb_str_resize(str, EVP_MD_CTX_size(ctx)); + rb_str_resize(str, out_len); } - EVP_DigestFinal_ex(ctx, (unsigned char *)RSTRING_PTR(str), NULL); + if (!EVP_DigestFinal_ex(ctx, (unsigned char *)RSTRING_PTR(str), NULL)) + ossl_raise(eDigestError, "EVP_DigestFinal_ex"); return str; } |