EVP_{CIPHER,MD}_CTX_ctrl(): make sure to return 0 or 1
authorRichard Levitte <levitte@openssl.org>
Sun, 6 Oct 2019 08:45:17 +0000 (10:45 +0200)
committerRichard Levitte <levitte@openssl.org>
Sun, 6 Oct 2019 10:09:03 +0000 (12:09 +0200)
Even thought the underlying calls might return something other than 0
or 1, EVP_CIPHER_CTX_ctrl() and EVP_MD_CTX_ctrl() were made to only
return those values regardless.  That behaviour was recently lost, so
we need to restore it.

Fixes #10106

Reviewed-by: Matthias St. Pierre <Matthias.St.Pierre@ncp-e.com>
(Merged from https://github.com/openssl/openssl/pull/10108)

crypto/evp/digest.c
crypto/evp/evp_enc.c

index 4f6b68c667842eddee9a60155d33fe860ca1d3e8..fa1dfa7303a0b65538704dd532c60c442b4c1c9b 100644 (file)
@@ -665,7 +665,7 @@ int EVP_MD_CTX_ctrl(EVP_MD_CTX *ctx, int cmd, int p1, void *p2)
         ret = EVP_MD_CTX_set_params(ctx, params);
     else
         ret = EVP_MD_CTX_get_params(ctx, params);
-    return ret;
+    goto conclude;
 
 
 /* TODO(3.0): Remove legacy code below */
@@ -676,6 +676,7 @@ int EVP_MD_CTX_ctrl(EVP_MD_CTX *ctx, int cmd, int p1, void *p2)
     }
 
     ret = ctx->digest->md_ctrl(ctx, cmd, p1, p2);
+ conclude:
     if (ret <= 0)
         return 0;
     return ret;
index eb85b26e5ac04b4462b0a5989684b16b19d0e7a4..046a9f60af86d6f26b531cf305ea7eb99840a8d7 100644 (file)
@@ -1148,7 +1148,7 @@ int EVP_CIPHER_CTX_ctrl(EVP_CIPHER_CTX *ctx, int type, int arg, void *ptr)
         ret = evp_do_ciph_ctx_setparams(ctx->cipher, ctx->provctx, params);
     else
         ret = evp_do_ciph_ctx_getparams(ctx->cipher, ctx->provctx, params);
-    return ret;
+    goto conclude;
 
 /* TODO(3.0): Remove legacy code below */
 legacy:
@@ -1158,6 +1158,8 @@ legacy:
     }
 
     ret = ctx->cipher->ctrl(ctx, type, arg, ptr);
+
+ conclude:
     if (ret == EVP_CTRL_RET_UNSUPPORTED) {
         EVPerr(EVP_F_EVP_CIPHER_CTX_CTRL,
                EVP_R_CTRL_OPERATION_NOT_IMPLEMENTED);