From 721be8d6ea26d78fc086a2e85413858585ca9300 Mon Sep 17 00:00:00 2001 From: Willi Mann Date: Thu, 16 Nov 2023 11:50:27 +0100 Subject: [PATCH] libpq: Fix race condition in initialization of my_bio_methods static variable --- src/interfaces/libpq/fe-secure-openssl.c | 26 ++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/src/interfaces/libpq/fe-secure-openssl.c b/src/interfaces/libpq/fe-secure-openssl.c index f1192d28f2..e8fa3eb403 100644 --- a/src/interfaces/libpq/fe-secure-openssl.c +++ b/src/interfaces/libpq/fe-secure-openssl.c @@ -81,6 +81,7 @@ static int PQssl_passwd_cb(char *buf, int size, int rwflag, void *userdata); static int my_sock_read(BIO *h, char *buf, int size); static int my_sock_write(BIO *h, const char *buf, int size); static BIO_METHOD *my_BIO_s_socket(void); +static void my_BIO_methods_init(void); static int my_SSL_set_fd(PGconn *conn, int fd); @@ -1882,8 +1883,8 @@ my_sock_write(BIO *h, const char *buf, int size) return res; } -static BIO_METHOD * -my_BIO_s_socket(void) +static void +my_BIO_methods_init(void) { if (!my_bio_methods) { @@ -1893,11 +1894,11 @@ my_BIO_s_socket(void) my_bio_index = BIO_get_new_index(); if (my_bio_index == -1) - return NULL; + return; 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; + return; /* * As of this writing, these functions never fail. But check anyway, @@ -1914,17 +1915,30 @@ my_BIO_s_socket(void) { BIO_meth_free(my_bio_methods); my_bio_methods = NULL; - return NULL; + return; } #else my_bio_methods = malloc(sizeof(BIO_METHOD)); if (!my_bio_methods) - return NULL; + return; memcpy(my_bio_methods, biom, sizeof(BIO_METHOD)); my_bio_methods->bread = my_sock_read; my_bio_methods->bwrite = my_sock_write; #endif } +} + +static pthread_mutex_t my_BIO_methods_init_mutex = PTHREAD_MUTEX_INITIALIZER; + +static BIO_METHOD * +my_BIO_s_socket() +{ + if (pthread_mutex_lock(&my_BIO_methods_init_mutex) != 0) + { + return NULL; + } + my_BIO_methods_init(); + pthread_mutex_unlock(&my_BIO_methods_init_mutex); return my_bio_methods; } -- 2.39.2