diff options
author | Dr. David von Oheimb <David.von.Oheimb@siemens.com> | 2021-06-03 12:56:11 +0200 |
---|---|---|
committer | Pauli <pauli@openssl.org> | 2021-06-08 15:17:11 +1000 |
commit | 5d43bfa7d58c6af5e40d6615edc83c709df2852b (patch) | |
tree | 519dc8b66b19ca874a44bc2bbd7deb9aa6f6a72c /crypto | |
parent | f41fd10d90fb5202f4c05f8842b4a4f25afd51d0 (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.c | 17 |
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) |