Drop BIO_n{read,write}{,0}()
authortb <tb@openbsd.org>
Fri, 28 Jul 2023 10:13:50 +0000 (10:13 +0000)
committertb <tb@openbsd.org>
Fri, 28 Jul 2023 10:13:50 +0000 (10:13 +0000)
This is one of those strange things that should never have made it into
a security-oriented libraries. From BIO_s_bio.3:

.\" The following non-copying I/O functions are intentionally undocumented
.\" because they seem fragile and unused by anything:

It was used in a single place: the gorgeous ssltest. I'm not smart enough
to follow.  Also:

/* WARNING: The non-copying interface is largely untested as of yet
 * and may contain bugs. */

Oh, really? Into the great bitbucket in the sky you go.

ok jsing

lib/libcrypto/Symbols.list
lib/libcrypto/Symbols.namespace
lib/libcrypto/bio/bss_bio.c
lib/libcrypto/hidden/openssl/bio.h

index 9f27a69..94a2293 100644 (file)
@@ -325,12 +325,8 @@ BIO_new_fp
 BIO_new_mem_buf
 BIO_new_socket
 BIO_next
-BIO_nread
-BIO_nread0
 BIO_number_read
 BIO_number_written
-BIO_nwrite
-BIO_nwrite0
 BIO_pop
 BIO_printf
 BIO_ptr_ctrl
index e669cc8..07a1b86 100644 (file)
@@ -1195,10 +1195,6 @@ _libre_BIO_get_retry_BIO
 _libre_BIO_get_retry_reason
 _libre_BIO_set_retry_reason
 _libre_BIO_dup_chain
-_libre_BIO_nread0
-_libre_BIO_nread
-_libre_BIO_nwrite0
-_libre_BIO_nwrite
 _libre_BIO_debug_callback
 _libre_BIO_s_mem
 _libre_BIO_new_mem_buf
index d4c03ab..9a3215a 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: bss_bio.c,v 1.27 2023/07/07 19:37:53 beck Exp $ */
+/* $OpenBSD: bss_bio.c,v 1.28 2023/07/28 10:13:50 tb Exp $ */
 /* ====================================================================
  * Copyright (c) 1998-2003 The OpenSSL Project.  All rights reserved.
  *
@@ -251,85 +251,6 @@ bio_read(BIO *bio, char *buf, int size_)
        return size;
 }
 
-/* non-copying interface: provide pointer to available data in buffer
- *    bio_nread0:  return number of available bytes
- *    bio_nread:   also advance index
- * (example usage:  bio_nread0(), read from buffer, bio_nread()
- *  or just         bio_nread(), read from buffer)
- */
-/* WARNING: The non-copying interface is largely untested as of yet
- * and may contain bugs. */
-static ssize_t
-bio_nread0(BIO *bio, char **buf)
-{
-       struct bio_bio_st *b, *peer_b;
-       ssize_t num;
-
-       BIO_clear_retry_flags(bio);
-
-       if (!bio->init)
-               return 0;
-
-       b = bio->ptr;
-       assert(b != NULL);
-       assert(b->peer != NULL);
-       peer_b = b->peer->ptr;
-       assert(peer_b != NULL);
-       assert(peer_b->buf != NULL);
-
-       peer_b->request = 0;
-
-       if (peer_b->len == 0) {
-               char dummy;
-
-               /* avoid code duplication -- nothing available for reading */
-               return bio_read(bio, &dummy, 1); /* returns 0 or -1 */
-       }
-
-       num = peer_b->len;
-       if (peer_b->size < peer_b->offset + num)
-               /* no ring buffer wrap-around for non-copying interface */
-               num = peer_b->size - peer_b->offset;
-       assert(num > 0);
-
-       if (buf != NULL)
-               *buf = peer_b->buf + peer_b->offset;
-       return num;
-}
-
-static ssize_t
-bio_nread(BIO *bio, char **buf, size_t num_)
-{
-       struct bio_bio_st *b, *peer_b;
-       ssize_t num, available;
-
-       if (num_ > SSIZE_MAX)
-               num = SSIZE_MAX;
-       else
-               num = (ssize_t)num_;
-
-       available = bio_nread0(bio, buf);
-       if (num > available)
-               num = available;
-       if (num <= 0)
-               return num;
-
-       b = bio->ptr;
-       peer_b = b->peer->ptr;
-
-       peer_b->len -= num;
-       if (peer_b->len) {
-               peer_b->offset += num;
-               assert(peer_b->offset <= peer_b->size);
-               if (peer_b->offset == peer_b->size)
-                       peer_b->offset = 0;
-       } else
-               peer_b->offset = 0;
-
-       return num;
-}
-
-
 static int
 bio_write(BIO *bio, const char *buf, int num_)
 {
@@ -402,85 +323,6 @@ bio_write(BIO *bio, const char *buf, int num_)
        return num;
 }
 
-/* non-copying interface: provide pointer to region to write to
- *   bio_nwrite0:  check how much space is available
- *   bio_nwrite:   also increase length
- * (example usage:  bio_nwrite0(), write to buffer, bio_nwrite()
- *  or just         bio_nwrite(), write to buffer)
- */
-static ssize_t
-bio_nwrite0(BIO *bio, char **buf)
-{
-       struct bio_bio_st *b;
-       size_t num;
-       size_t write_offset;
-
-       BIO_clear_retry_flags(bio);
-
-       if (!bio->init)
-               return 0;
-
-       b = bio->ptr;
-
-       assert(b != NULL);
-       assert(b->peer != NULL);
-       assert(b->buf != NULL);
-
-       b->request = 0;
-       if (b->closed) {
-               BIOerror(BIO_R_BROKEN_PIPE);
-               return -1;
-       }
-
-       assert(b->len <= b->size);
-
-       if (b->len == b->size) {
-               BIO_set_retry_write(bio);
-               return -1;
-       }
-
-       num = b->size - b->len;
-       write_offset = b->offset + b->len;
-       if (write_offset >= b->size)
-               write_offset -= b->size;
-       if (write_offset + num > b->size)
-               /* no ring buffer wrap-around for non-copying interface
-                * (to fulfil the promise by BIO_ctrl_get_write_guarantee,
-                * BIO_nwrite may have to be called twice) */
-               num = b->size - write_offset;
-
-       if (buf != NULL)
-               *buf = b->buf + write_offset;
-       assert(write_offset + num <= b->size);
-
-       return num;
-}
-
-static ssize_t
-bio_nwrite(BIO *bio, char **buf, size_t num_)
-{
-       struct bio_bio_st *b;
-       ssize_t num, space;
-
-       if (num_ > SSIZE_MAX)
-               num = SSIZE_MAX;
-       else
-               num = (ssize_t)num_;
-
-       space = bio_nwrite0(bio, buf);
-       if (num > space)
-               num = space;
-       if (num <= 0)
-               return num;
-       b = bio->ptr;
-       assert(b != NULL);
-       b->len += num;
-       assert(b->len <= b->size);
-
-       return num;
-}
-
-
 static long
 bio_ctrl(BIO *bio, int cmd, long num, void *ptr)
 {
@@ -564,28 +406,7 @@ bio_ctrl(BIO *bio, int cmd, long num, void *ptr)
                ret = 1;
                break;
 
-       case BIO_C_NREAD0:
-               /* prepare for non-copying read */
-               ret = (long) bio_nread0(bio, ptr);
-               break;
-
-       case BIO_C_NREAD:
-               /* non-copying read */
-               ret = (long) bio_nread(bio, ptr, (size_t) num);
-               break;
-
-       case BIO_C_NWRITE0:
-               /* prepare for non-copying write */
-               ret = (long) bio_nwrite0(bio, ptr);
-               break;
-
-       case BIO_C_NWRITE:
-               /* non-copying write */
-               ret = (long) bio_nwrite(bio, ptr, (size_t) num);
-               break;
-
-
-               /* standard CTRL codes follow */
+       /* standard CTRL codes follow */
 
        case BIO_CTRL_RESET:
                if (b->buf != NULL) {
@@ -817,77 +638,3 @@ BIO_ctrl_reset_read_request(BIO *bio)
        return (BIO_ctrl(bio, BIO_C_RESET_READ_REQUEST, 0, NULL) != 0);
 }
 LCRYPTO_ALIAS(BIO_ctrl_reset_read_request);
-
-
-/* BIO_nread0/nread/nwrite0/nwrite are available only for BIO pairs for now
- * (conceivably some other BIOs could allow non-copying reads and writes too.)
- */
-int
-BIO_nread0(BIO *bio, char **buf)
-{
-       long ret;
-
-       if (!bio->init) {
-               BIOerror(BIO_R_UNINITIALIZED);
-               return -2;
-       }
-
-       ret = BIO_ctrl(bio, BIO_C_NREAD0, 0, buf);
-       if (ret > INT_MAX)
-               return INT_MAX;
-       else
-               return (int) ret;
-}
-LCRYPTO_ALIAS(BIO_nread0);
-
-int
-BIO_nread(BIO *bio, char **buf, int num)
-{
-       int ret;
-
-       if (!bio->init) {
-               BIOerror(BIO_R_UNINITIALIZED);
-               return -2;
-       }
-
-       ret = (int) BIO_ctrl(bio, BIO_C_NREAD, num, buf);
-       if (ret > 0)
-               bio->num_read += ret;
-       return ret;
-}
-LCRYPTO_ALIAS(BIO_nread);
-
-int
-BIO_nwrite0(BIO *bio, char **buf)
-{
-       long ret;
-
-       if (!bio->init) {
-               BIOerror(BIO_R_UNINITIALIZED);
-               return -2;
-       }
-
-       ret = BIO_ctrl(bio, BIO_C_NWRITE0, 0, buf);
-       if (ret > INT_MAX)
-               return INT_MAX;
-       else
-               return (int) ret;
-}
-LCRYPTO_ALIAS(BIO_nwrite0);
-
-int
-BIO_nwrite(BIO *bio, char **buf, int num)
-{
-       int ret;
-
-       if (!bio->init) {
-               BIOerror(BIO_R_UNINITIALIZED);
-               return -2;
-       }
-
-       ret = BIO_ctrl(bio, BIO_C_NWRITE, num, buf);
-       if (ret > 0)
-               bio->num_write += ret;
-       return ret;
-}
-LCRYPTO_ALIAS(BIO_nwrite);
index 46cbdf7..f7e7cd3 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: bio.h,v 1.3 2023/07/28 09:58:30 tb Exp $ */
+/* $OpenBSD: bio.h,v 1.4 2023/07/28 10:13:50 tb Exp $ */
 /*
  * Copyright (c) 2023 Bob Beck <beck@openbsd.org>
  *
@@ -97,10 +97,6 @@ LCRYPTO_USED(BIO_get_retry_BIO);
 LCRYPTO_USED(BIO_get_retry_reason);
 LCRYPTO_USED(BIO_set_retry_reason);
 LCRYPTO_USED(BIO_dup_chain);
-LCRYPTO_USED(BIO_nread0);
-LCRYPTO_USED(BIO_nread);
-LCRYPTO_USED(BIO_nwrite0);
-LCRYPTO_USED(BIO_nwrite);
 LCRYPTO_USED(BIO_debug_callback);
 LCRYPTO_USED(BIO_s_mem);
 LCRYPTO_USED(BIO_new_mem_buf);