Retire prev_bio
authortb <tb@openbsd.org>
Mon, 28 Nov 2022 07:50:00 +0000 (07:50 +0000)
committertb <tb@openbsd.org>
Mon, 28 Nov 2022 07:50:00 +0000 (07:50 +0000)
While BIO chains are doubly linked lists, nothing has ever made use of this
fact internally. Even libssl has failed to maintain prev_bio properly in
two places for a long time. When BIO was made opaque, the opportunity to
fix that was missed. Instead, BIO_set_next() now allows breaking the lists
from outside the library, which freerdp has long done.

Problem found by schwarze while trying to document BIO_set_next().

schwarze likes the idea
ok jsing

lib/libcrypto/bio/bio_lib.c
lib/libcrypto/bio/bio_local.h

index 2ac0abd..92c0d5e 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: bio_lib.c,v 1.36 2022/08/15 10:48:45 tb Exp $ */
+/* $OpenBSD: bio_lib.c,v 1.37 2022/11/28 07:50:00 tb Exp $ */
 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
  * All rights reserved.
  *
@@ -161,7 +161,6 @@ BIO_set(BIO *bio, const BIO_METHOD *method)
        bio->retry_reason = 0;
        bio->num = 0;
        bio->ptr = NULL;
-       bio->prev_bio = NULL;
        bio->next_bio = NULL;
        bio->references = 1;
        bio->num_read = 0L;
@@ -623,8 +622,6 @@ BIO_push(BIO *b, BIO *bio)
        while (lb->next_bio != NULL)
                lb = lb->next_bio;
        lb->next_bio = bio;
-       if (bio != NULL)
-               bio->prev_bio = lb;
        /* called to do internal processing */
        BIO_ctrl(b, BIO_CTRL_PUSH, 0, lb);
        return (b);
@@ -642,13 +639,7 @@ BIO_pop(BIO *b)
 
        BIO_ctrl(b, BIO_CTRL_POP, 0, b);
 
-       if (b->prev_bio != NULL)
-               b->prev_bio->next_bio = b->next_bio;
-       if (b->next_bio != NULL)
-               b->next_bio->prev_bio = b->prev_bio;
-
        b->next_bio = NULL;
-       b->prev_bio = NULL;
        return (ret);
 }
 
index 7e1885f..94dd460 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: bio_local.h,v 1.3 2022/01/14 08:40:57 tb Exp $ */
+/* $OpenBSD: bio_local.h,v 1.4 2022/11/28 07:50:00 tb Exp $ */
 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
  * All rights reserved.
  *
@@ -87,7 +87,6 @@ struct bio_st {
        int num;
        void *ptr;
        struct bio_st *next_bio;        /* used by filter BIOs */
-       struct bio_st *prev_bio;        /* used by filter BIOs */
        int references;
        unsigned long num_read;
        unsigned long num_write;