Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Set type identifier on BIO
authorDaniel Gustafsson <dgustafsson@postgresql.org>
Tue, 17 Aug 2021 12:27:37 +0000 (14:27 +0200)
committerDaniel Gustafsson <dgustafsson@postgresql.org>
Tue, 17 Aug 2021 12:30:39 +0000 (14:30 +0200)
In OpenSSL there are two types of BIO's (I/O abstractions):
source/sink and filters. A source/sink BIO is a source and/or
sink of data, ie one acting on a socket or a file. A filter
BIO takes a stream of input from another BIO and transforms it.
In order for BIO_find_type() to be able to traverse the chain
of BIO's and correctly find all BIO's of a certain type they
shall have the type bit set accordingly, source/sink BIO's
(what PostgreSQL implements) use BIO_TYPE_SOURCE_SINK and
filter BIO's use BIO_TYPE_FILTER. In addition to these, file
descriptor based BIO's should have the descriptor bit set,
BIO_TYPE_DESCRIPTOR.

The PostgreSQL implementation didn't set the type bits, which
went unnoticed for a long time as it's only really relevant
for code auditing the OpenSSL installation, or doing similar
tasks. It is required by the API though, so this fixes it.

Backpatch through 9.6 as this has been wrong for a long time.

Author: Itamar Gafni
Discussion: https://postgr.es/m/SN6PR06MB39665EC10C34BB20956AE4578AF39@SN6PR06MB3966.namprd06.prod.outlook.com
Backpatch-through: 9.6

src/backend/libpq/be-secure-openssl.c
src/interfaces/libpq/fe-secure-openssl.c

index 4788f88c5d3e0961166666df25021f7fbd7e3b45..795c2198a316e10cb2d5c71120eac730299fd075 100644 (file)
@@ -723,6 +723,7 @@ my_BIO_s_socket(void)
        my_bio_index = BIO_get_new_index();
        if (my_bio_index == -1)
            return NULL;
+       my_bio_index |= (BIO_TYPE_DESCRIPTOR | BIO_TYPE_SOURCE_SINK);
        my_bio_methods = BIO_meth_new(my_bio_index, "PostgreSQL backend socket");
        if (!my_bio_methods)
            return NULL;
index 66d50a959b64c7f43bae73e761edd7ea7aacb2d7..7aa7a06ad241c278abc813ac8619a0c9380cc82b 100644 (file)
@@ -1531,6 +1531,7 @@ my_BIO_s_socket(void)
        my_bio_index = BIO_get_new_index();
        if (my_bio_index == -1)
            return NULL;
+       my_bio_index |= (BIO_TYPE_DESCRIPTOR | BIO_TYPE_SOURCE_SINK);
        my_bio_methods = BIO_meth_new(my_bio_index, "libpq socket");
        if (!my_bio_methods)
            return NULL;