summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--crypto/evp/bio_enc.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/crypto/evp/bio_enc.c b/crypto/evp/bio_enc.c
index 2333c20ef6..a284b6d9eb 100644
--- a/crypto/evp/bio_enc.c
+++ b/crypto/evp/bio_enc.c
@@ -297,6 +297,7 @@ static long enc_ctrl(BIO *b, int cmd, long num, void *ptr)
int i;
EVP_CIPHER_CTX **c_ctx;
BIO *next;
+ int pend;
ctx = BIO_get_data(b);
next = BIO_next(b);
@@ -332,8 +333,14 @@ static long enc_ctrl(BIO *b, int cmd, long num, void *ptr)
/* do a final write */
again:
while (ctx->buf_len != ctx->buf_off) {
+ pend = ctx->buf_len - ctx->buf_off;
i = enc_write(b, NULL, 0);
- if (i < 0)
+ /*
+ * i should never be > 0 here because we didn't ask to write any
+ * new data. We stop if we get an error or we failed to make any
+ * progress writing pending data.
+ */
+ if (i < 0 || (ctx->buf_len - ctx->buf_off) == pend)
return i;
}