[libdbd-pg-perl] 05/35: Protect against crash if missing client_encoding

Christoph Berg myon at debian.org
Wed Sep 27 17:41:02 UTC 2017


This is an automated email from the git hooks/post-receive script.

myon pushed a commit to branch master
in repository libdbd-pg-perl.

commit f29a19e77104507ea3a8f289de3725d0cffbe63e
Author: David Christensen <david at endpoint.com>
Date:   Wed Sep 13 11:49:03 2017 -0500

    Protect against crash if missing client_encoding
    
    If "client_encoding" was not exposed as a connection parameter via libpq (as might be in a custom
    wire-protocol-based application) the pg_db_detect_client_encoding_utf8() function would crash.  Test
    for NULL to prevent this and set the appropriate default value.
    
    Reported-by: Marko Tiikkaja <marko at joh.to>
---
 Changes  |  3 +++
 dbdimp.c | 29 +++++++++++++++++------------
 2 files changed, 20 insertions(+), 12 deletions(-)

diff --git a/Changes b/Changes
index ab0ea60..1563d6a 100644
--- a/Changes
+++ b/Changes
@@ -1,6 +1,9 @@
 
   - Fix running tests with non-UTF8 server_encoding
     (Github issue #26)
+  - Fix crash with missing client_encoding
+    (Github issue #29)
+    [David Christensen, reported by Marko Tiikkaja]
 
 Version 3.6.2  Released May 23, 2017 (git tag 3.6.2)
 
diff --git a/dbdimp.c b/dbdimp.c
index 7976189..065360c 100644
--- a/dbdimp.c
+++ b/dbdimp.c
@@ -2992,18 +2992,23 @@ static void pg_db_detect_client_encoding_utf8(pTHX_ imp_dbh_t *imp_dbh) {
 	int i, j;
 	const char * const client_encoding =
 		PQparameterStatus(imp_dbh->conn, "client_encoding");
-	STRLEN len = strlen(client_encoding);
-	Newx(clean_encoding, len + 1, char);
-	for (i = 0, j = 0; i < len; i++) {
-		const char c = toLOWER(client_encoding[i]);
-		if (isALPHA(c) || isDIGIT(c))
-			clean_encoding[j++] = c;
-	};
-	clean_encoding[j] = '\0';
-	imp_dbh->client_encoding_utf8 =
-		(strnEQ(clean_encoding, "utf8", 4) || strnEQ(clean_encoding, "unicode", 8))
-		? DBDPG_TRUE : DBDPG_FALSE;
-	Safefree(clean_encoding);
+	if (NULL != client_encoding) {
+		STRLEN len = strlen(client_encoding);
+		Newx(clean_encoding, len + 1, char);
+		for (i = 0, j = 0; i < len; i++) {
+			const char c = toLOWER(client_encoding[i]);
+			if (isALPHA(c) || isDIGIT(c))
+				clean_encoding[j++] = c;
+		};
+		clean_encoding[j] = '\0';
+		imp_dbh->client_encoding_utf8 =
+			(strnEQ(clean_encoding, "utf8", 4) || strnEQ(clean_encoding, "unicode", 8))
+			? DBDPG_TRUE : DBDPG_FALSE;
+		Safefree(clean_encoding);
+	}
+	else {
+		imp_dbh->client_encoding_utf8 = DBDPG_FALSE;
+	}
 }
 
 /* ================================================================== */

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-perl/packages/libdbd-pg-perl.git



More information about the Pkg-perl-cvs-commits mailing list