summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--crypto/bio/bss_conn.c19
-rw-r--r--doc/man3/BIO_s_connect.pod12
-rw-r--r--include/openssl/bio.h.in2
-rw-r--r--ssl/quic/quic_impl.c2
-rw-r--r--util/other.syms2
5 files changed, 23 insertions, 14 deletions
diff --git a/crypto/bio/bss_conn.c b/crypto/bio/bss_conn.c
index 8d29f94bd1..f09160b3c0 100644
--- a/crypto/bio/bss_conn.c
+++ b/crypto/bio/bss_conn.c
@@ -347,8 +347,7 @@ static int conn_free(BIO *a)
return 0;
data = (BIO_CONNECT *)a->ptr;
- if (data->dgram_bio != NULL)
- BIO_free(data->dgram_bio);
+ BIO_free(data->dgram_bio);
if (a->shutdown) {
conn_close_socket(a);
@@ -372,8 +371,12 @@ static int conn_read(BIO *b, char *out, int outl)
return ret;
}
- if (data->dgram_bio != NULL)
- return BIO_read(data->dgram_bio, out, outl);
+ if (data->dgram_bio != NULL) {
+ BIO_clear_retry_flags(b);
+ ret = BIO_read(data->dgram_bio, out, outl);
+ BIO_set_flags(b, BIO_get_retry_flags(data->dgram_bio));
+ return ret;
+ }
if (out != NULL) {
clear_socket_error();
@@ -406,8 +409,12 @@ static int conn_write(BIO *b, const char *in, int inl)
return ret;
}
- if (data->dgram_bio != NULL)
- return BIO_write(data->dgram_bio, in, inl);
+ if (data->dgram_bio != NULL) {
+ BIO_clear_retry_flags(b);
+ ret = BIO_write(data->dgram_bio, in, inl);
+ BIO_set_flags(b, BIO_get_retry_flags(data->dgram_bio));
+ return ret;
+ }
clear_socket_error();
# ifndef OPENSSL_NO_KTLS
diff --git a/doc/man3/BIO_s_connect.pod b/doc/man3/BIO_s_connect.pod
index 0c1106c523..35d67787ff 100644
--- a/doc/man3/BIO_s_connect.pod
+++ b/doc/man3/BIO_s_connect.pod
@@ -7,7 +7,7 @@ BIO_set_conn_hostname, BIO_set_conn_port,
BIO_set_conn_address, BIO_set_conn_ip_family,
BIO_get_conn_hostname, BIO_get_conn_port,
BIO_get_conn_address, BIO_get_conn_ip_family,
-BIO_set_nbio, BIO_set_sock_type, BIO_get_sock_type, BIO_get_dgram_bio,
+BIO_set_nbio, BIO_set_sock_type, BIO_get_sock_type, BIO_get0_dgram_bio,
BIO_do_connect - connect BIO
=head1 SYNOPSIS
@@ -31,7 +31,7 @@ BIO_do_connect - connect BIO
int BIO_set_sock_type(BIO *b, int sock_type);
int BIO_get_sock_type(BIO *b);
- int BIO_get_dgram_bio(BIO *B, BIO **dgram_bio);
+ int BIO_get0_dgram_bio(BIO *B, BIO **dgram_bio);
long BIO_do_connect(BIO *b);
@@ -112,8 +112,10 @@ default) and B<SOCK_DGRAM>. If B<SOCK_DGRAM> is configured, the connection
created is a UDP datagram socket handled via L<BIO_s_datagram(3)>.
I/O calls such as L<BIO_read(3)> and L<BIO_write(3)> are forwarded transparently
to an internal L<BIO_s_datagram(3)> instance. The created L<BIO_s_datagram(3)>
-instance can be retrieved using BIO_get_dgram_bio() if desired, which writes
-a pointer to the L<BIO_s_datagram(3)> instance to I<*dgram_bio>.
+instance can be retrieved using BIO_get0_dgram_bio() if desired, which writes
+a pointer to the L<BIO_s_datagram(3)> instance to I<*dgram_bio>. The lifetime
+of the internal L<BIO_s_datagram(3)> is managed by BIO_s_connect() and does not
+need to be freed by the caller.
BIO_get_sock_type() retrieves the value set using BIO_set_sock_type().
@@ -181,7 +183,7 @@ BIO_set_sock_type() returns 1 on success or 0 on failure.
BIO_get_sock_type() returns a socket type or 0 if the call is not supported.
-BIO_get_dgram_bio() returns 1 on success or 0 on failure.
+BIO_get0_dgram_bio() returns 1 on success or 0 on failure.
=head1 EXAMPLES
diff --git a/include/openssl/bio.h.in b/include/openssl/bio.h.in
index e6af3470a5..aa05d7d9cf 100644
--- a/include/openssl/bio.h.in
+++ b/include/openssl/bio.h.in
@@ -495,7 +495,7 @@ typedef struct bio_poll_descriptor_st {
# define BIO_set_conn_mode(b,n) BIO_ctrl(b,BIO_C_SET_CONNECT_MODE,(n),NULL)
# define BIO_set_sock_type(b,t) BIO_ctrl(b,BIO_C_SET_SOCK_TYPE,(t),NULL)
# define BIO_get_sock_type(b) BIO_ctrl(b,BIO_C_GET_SOCK_TYPE,0,NULL)
-# define BIO_get_dgram_bio(b, p) BIO_ctrl(b,BIO_C_GET_DGRAM_BIO,0,(void *)(BIO **)(p))
+# define BIO_get0_dgram_bio(b, p) BIO_ctrl(b,BIO_C_GET_DGRAM_BIO,0,(void *)(BIO **)(p))
/* BIO_s_accept() */
# define BIO_set_accept_name(b,name) BIO_ctrl(b,BIO_C_SET_ACCEPT,0, \
diff --git a/ssl/quic/quic_impl.c b/ssl/quic/quic_impl.c
index 839168040b..11c8afce8a 100644
--- a/ssl/quic/quic_impl.c
+++ b/ssl/quic/quic_impl.c
@@ -1581,7 +1581,7 @@ static int quic_do_handshake(QCTX *ctx)
* We do this as late as possible because some BIOs (e.g. BIO_s_connect)
* may not be able to provide us with a peer address until they have
* finished their own processing. They may not be able to perform this
- * processing until an application has figured configuring that BIO
+ * processing until an application has finished configuring that BIO
* (e.g. with setter calls), which might happen after SSL_set_bio is
* called.
*/
diff --git a/util/other.syms b/util/other.syms
index cd1f73468d..4bac4afeaa 100644
--- a/util/other.syms
+++ b/util/other.syms
@@ -169,7 +169,7 @@ BIO_dgram_set_peer define
BIO_dgram_recv_timedout define
BIO_dgram_send_timedout define
BIO_dgram_detect_peer_addr define
-BIO_get_dgram_bio define
+BIO_get0_dgram_bio define
BIO_get_sock_type define
BIO_set_sock_type define
BIO_do_accept define