0001-libpq-Fix-race-condition-in-initialization-of-my_bio.patch
text/x-patch
Filename: 0001-libpq-Fix-race-condition-in-initialization-of-my_bio.patch
Type: text/x-patch
Part: 0
Patch
Format: format-patch
Series: patch 0001
Subject: libpq: Fix race condition in initialization of my_bio_methods static variable
| File | + | − |
|---|---|---|
| src/interfaces/libpq/fe-secure-openssl.c | 20 | 6 |
From 721be8d6ea26d78fc086a2e85413858585ca9300 Mon Sep 17 00:00:00 2001
From: Willi Mann <w.mann@celonis.com>
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