summaryrefslogtreecommitdiffstats
path: root/crypto
diff options
context:
space:
mode:
authorDr. David von Oheimb <David.von.Oheimb@siemens.com>2021-06-03 12:56:11 +0200
committerPauli <pauli@openssl.org>2021-06-08 15:17:11 +1000
commit5d43bfa7d58c6af5e40d6615edc83c709df2852b (patch)
tree519dc8b66b19ca874a44bc2bbd7deb9aa6f6a72c /crypto
parentf41fd10d90fb5202f4c05f8842b4a4f25afd51d0 (diff)
BIO_write-ex(): Improve behavior in corner cases and documentation
Reviewed-by: Tomas Mraz <tomas@openssl.org> Reviewed-by: Paul Dale <pauli@openssl.org> (Merged from https://github.com/openssl/openssl/pull/15608)
Diffstat (limited to 'crypto')
-rw-r--r--crypto/bio/bio_lib.c17
1 files changed, 11 insertions, 6 deletions
diff --git a/crypto/bio/bio_lib.c b/crypto/bio/bio_lib.c
index 80b81db5c4..cdce122796 100644
--- a/crypto/bio/bio_lib.c
+++ b/crypto/bio/bio_lib.c
@@ -332,8 +332,11 @@ int BIO_read_ex(BIO *b, void *data, size_t dlen, size_t *readbytes)
static int bio_write_intern(BIO *b, const void *data, size_t dlen,
size_t *written)
{
+ size_t local_written;
int ret;
+ if (written != NULL)
+ *written = 0;
/*
* b == NULL is not an error but just means that zero bytes are written.
* Do not raise an error here.
@@ -356,15 +359,17 @@ static int bio_write_intern(BIO *b, const void *data, size_t dlen,
return -1;
}
- ret = b->method->bwrite(b, data, dlen, written);
+ ret = b->method->bwrite(b, data, dlen, &local_written);
if (ret > 0)
- b->num_write += (uint64_t)*written;
+ b->num_write += (uint64_t)local_written;
if (HAS_CALLBACK(b))
ret = (int)bio_call_callback(b, BIO_CB_WRITE | BIO_CB_RETURN, data,
- dlen, 0, 0L, ret, written);
+ dlen, 0, 0L, ret, &local_written);
+ if (written != NULL)
+ *written = local_written;
return ret;
}
@@ -373,13 +378,13 @@ int BIO_write(BIO *b, const void *data, int dlen)
size_t written;
int ret;
- if (dlen < 0)
+ if (dlen <= 0)
return 0;
ret = bio_write_intern(b, data, (size_t)dlen, &written);
if (ret > 0) {
- /* *written should always be <= dlen */
+ /* written should always be <= dlen */
ret = (int)written;
}
@@ -388,7 +393,7 @@ int BIO_write(BIO *b, const void *data, int dlen)
int BIO_write_ex(BIO *b, const void *data, size_t dlen, size_t *written)
{
- return bio_write_intern(b, data, dlen, written) > 0;
+ return bio_write_intern(b, data, dlen, written) >= 0;
}
int BIO_puts(BIO *b, const char *buf)