From c187de1101744c57af041427199eab9630643951 Mon Sep 17 00:00:00 2001 From: Heikki Linnakangas Date: Thu, 5 Jan 2023 14:00:27 +0200 Subject: [PATCH] Copy error message before it's freed. pageserver_disconnect() call invalidates 'pageserver_conn', including the error message pointer we got from PQerrorMessage(pageserver_conn). Copy the message to a temporary variable before disconnecting, like we do in a few other places. In the passing, clear 'pageserver_conn_wes' variable in a few places where it was free'd. I didn't see any live bug from this, but since pageserver_disconnect() checks if it's NULL, let's not leave it dangling to already-free'd memory. --- pgxn/neon/libpagestore.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/pgxn/neon/libpagestore.c b/pgxn/neon/libpagestore.c index c6199dddc0..0760842627 100644 --- a/pgxn/neon/libpagestore.c +++ b/pgxn/neon/libpagestore.c @@ -111,6 +111,7 @@ pageserver_connect() PQfinish(pageserver_conn); pageserver_conn = NULL; FreeWaitEventSet(pageserver_conn_wes); + pageserver_conn_wes = NULL; neon_log(ERROR, "could not complete handshake with pageserver: %s", msg); @@ -179,7 +180,10 @@ pageserver_disconnect(void) prefetch_on_ps_disconnect(); } if (pageserver_conn_wes != NULL) + { FreeWaitEventSet(pageserver_conn_wes); + pageserver_conn_wes = NULL; + } } static void @@ -206,7 +210,7 @@ pageserver_send(NeonRequest * request) */ if (PQputCopyData(pageserver_conn, req_buff.data, req_buff.len) <= 0) { - char *msg = PQerrorMessage(pageserver_conn); + char *msg = pchomp(PQerrorMessage(pageserver_conn)); pageserver_disconnect(); neon_log(ERROR, "failed to send page request: %s", msg);