Skip to content

Commit dea8349

Browse files
committed
Avoid crash after function syntax error in a replication worker.
If a syntax error occurred in a SQL-language or PL/pgSQL-language CREATE FUNCTION or DO command executed in a logical replication worker, we'd suffer a null pointer dereference or assertion failure. That seems like a rather contrived case, but nonetheless worth fixing. The cause is that function_parse_error_transpose assumes it must be executing within the context of a Portal, but logical/worker.c doesn't create a Portal since it's not running the standard executor. We can just back off the hard Assert check and make it fail gracefully if there's not an ActivePortal. (I have a feeling that the aggressive check here was my fault originally, probably because I wasn't sure if the case would always hold and wanted to find out. Well, now we know.) The hazard seems to exist in all branches that have logical replication, so back-patch to v10. Maxim Orlov, Anton Melnikov, Masahiko Sawada, Tom Lane Discussion: https://postgr.es/m/b570c367-ba38-95f3-f62d-5f59b9808226@inbox.ru Discussion: https://postgr.es/m/adf0452f-8c6b-7def-d35e-ab516c80088e@inbox.ru
1 parent 5fca910 commit dea8349

File tree

1 file changed

+15
-5
lines changed

1 file changed

+15
-5
lines changed

src/backend/catalog/pg_proc.c

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1017,7 +1017,6 @@ function_parse_error_transpose(const char *prosrc)
10171017
{
10181018
int origerrposition;
10191019
int newerrposition;
1020-
const char *queryText;
10211020

10221021
/*
10231022
* Nothing to do unless we are dealing with a syntax error that has a
@@ -1035,11 +1034,22 @@ function_parse_error_transpose(const char *prosrc)
10351034
}
10361035

10371036
/* We can get the original query text from the active portal (hack...) */
1038-
Assert(ActivePortal && ActivePortal->status == PORTAL_ACTIVE);
1039-
queryText = ActivePortal->sourceText;
1037+
if (ActivePortal && ActivePortal->status == PORTAL_ACTIVE)
1038+
{
1039+
const char *queryText = ActivePortal->sourceText;
10401040

1041-
/* Try to locate the prosrc in the original text */
1042-
newerrposition = match_prosrc_to_query(prosrc, queryText, origerrposition);
1041+
/* Try to locate the prosrc in the original text */
1042+
newerrposition = match_prosrc_to_query(prosrc, queryText,
1043+
origerrposition);
1044+
}
1045+
else
1046+
{
1047+
/*
1048+
* Quietly give up if no ActivePortal. This is an unusual situation
1049+
* but it can happen in, e.g., logical replication workers.
1050+
*/
1051+
newerrposition = -1;
1052+
}
10431053

10441054
if (newerrposition > 0)
10451055
{

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy