v4-0001-Add-missing-connection-validation-in-ECPG.patch
application/octet-stream
Filename: v4-0001-Add-missing-connection-validation-in-ECPG.patch
Type: application/octet-stream
Part: 0
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: format-patch
Series: patch v4-0001
Subject: Add missing connection validation in ECPG
| File | + | − |
|---|---|---|
| src/interfaces/ecpg/ecpglib/descriptor.c | 8 | 0 |
| src/interfaces/ecpg/ecpglib/prepare.c | 17 | 8 |
From 75ee6b6cb5f86139deb7b0f3caa8ab5f69455bca Mon Sep 17 00:00:00 2001
From: shruthi gowda <shruthi.kc@enterprisedb.com>
Date: Wed, 8 Apr 2026 11:32:16 +0000
Subject: [PATCH v4] Add missing connection validation in ECPG
ECPGdeallocate_all(), ECPGprepared_statement(), ECPGget_desc(), and
ecpg_freeStmtCacheEntry() could crash or misbehave when operating on
NULL or invalid connections. Add proper connection validation to
prevent dereferencing NULL pointers.
---
src/interfaces/ecpg/ecpglib/descriptor.c | 8 ++++++++
src/interfaces/ecpg/ecpglib/prepare.c | 25 ++++++++++++++++--------
2 files changed, 25 insertions(+), 8 deletions(-)
diff --git a/src/interfaces/ecpg/ecpglib/descriptor.c b/src/interfaces/ecpg/ecpglib/descriptor.c
index 39cd5130ec9..88f1e9858b0 100644
--- a/src/interfaces/ecpg/ecpglib/descriptor.c
+++ b/src/interfaces/ecpg/ecpglib/descriptor.c
@@ -507,6 +507,14 @@ ECPGget_desc(int lineno, const char *desc_name, int index,...)
/* desperate try to guess something sensible */
stmt.connection = ecpg_get_connection(NULL);
+ if (stmt.connection == NULL)
+ {
+ ecpg_raise(lineno, ECPG_NO_CONN, ECPG_SQLSTATE_CONNECTION_DOES_NOT_EXIST,
+ ecpg_gettext("NULL"));
+ va_end(args);
+ return false;
+ }
+
ecpg_store_result(ECPGresult, index, &stmt, &data_var);
#ifdef HAVE_USELOCALE
diff --git a/src/interfaces/ecpg/ecpglib/prepare.c b/src/interfaces/ecpg/ecpglib/prepare.c
index 5c7c5397535..f9489044724 100644
--- a/src/interfaces/ecpg/ecpglib/prepare.c
+++ b/src/interfaces/ecpg/ecpglib/prepare.c
@@ -381,8 +381,12 @@ ecpg_deallocate_all_conn(int lineno, enum COMPAT_MODE c, struct connection *con)
bool
ECPGdeallocate_all(int lineno, int compat, const char *connection_name)
{
- return ecpg_deallocate_all_conn(lineno, compat,
- ecpg_get_connection(connection_name));
+ struct connection *con = ecpg_get_connection(connection_name);
+
+ if (!ecpg_init(con, connection_name, lineno))
+ return false;
+
+ return ecpg_deallocate_all_conn(lineno, compat, con);
}
char *
@@ -395,13 +399,15 @@ ecpg_prepared(const char *name, struct connection *con)
}
/* return the prepared statement */
-/* lineno is not used here, but kept in to not break API */
char *
ECPGprepared_statement(const char *connection_name, const char *name, int lineno)
{
- (void) lineno; /* keep the compiler quiet */
+ struct connection *con = ecpg_get_connection(connection_name);
+
+ if (!ecpg_init(con, connection_name, lineno))
+ return NULL;
- return ecpg_prepared(name, ecpg_get_connection(connection_name));
+ return ecpg_prepared(name, con);
}
/*
@@ -499,9 +505,12 @@ ecpg_freeStmtCacheEntry(int lineno, int compat,
con = ecpg_get_connection(entry->connection);
/* free the 'prepared_statement' list entry */
- this = ecpg_find_prepared_statement(entry->stmtID, con, &prev);
- if (this && !deallocate_one(lineno, compat, con, prev, this))
- return -1;
+ if (con)
+ {
+ this = ecpg_find_prepared_statement(entry->stmtID, con, &prev);
+ if (this && !deallocate_one(lineno, compat, con, prev, this))
+ return -1;
+ }
entry->stmtID[0] = '\0';
--
2.43.0