patches fixing bugs in postgres 7.1 driver

Michael Jerris <[email protected]> Fri, 18 Apr 2014 13:47:13 -0400
Newsgroups gmane.comp.db.unixodbc.devel
Message-ID <[email protected]>
--Apple-Mail=_B84D049B-C62E-40A0-864C-A89BC0370371
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain;
	charset=us-ascii

Please see attached patches for memory leaks and a data truncation issue =
in the postgres driver.  Feedback and inclusion appreciated.

Thanks
Mike


--Apple-Mail=_B84D049B-C62E-40A0-864C-A89BC0370371
Content-Disposition: attachment;
	filename=postgres7.1.fixes.diff
Content-Type: application/octet-stream;
	name="postgres7.1.fixes.diff"
Content-Transfer-Encoding: 7bit

commit 736ffd7de5c70c30660867433490f2d728038365
Author: Michael Jerris <[email protected]>
Date:   Fri Apr 18 13:42:46 2014 -0400

    postgres 7.1 driver float cat be 15 decimal places plus the period for 16

diff --git a/Drivers/Postgre7.1/pgtypes.c b/Drivers/Postgre7.1/pgtypes.c
index e4964b8..1602db5 100644
--- a/Drivers/Postgre7.1/pgtypes.c
+++ b/Drivers/Postgre7.1/pgtypes.c
@@ -480,7 +480,7 @@ Int4 pgtype_precision(StatementClass *stmt, Int4 type, int col, int handle_unkno
 	case PG_TYPE_FLOAT4:        
 	case PG_TYPE_MONEY:			return 7;
 
-	case PG_TYPE_FLOAT8:        return 15;
+	case PG_TYPE_FLOAT8:        return 16;
 
 	case PG_TYPE_DATE:			return 10;
 	case PG_TYPE_TIME:			return 8;

commit 796ed9fc7a885e03164fb99f0683e28b8296e45b
Author: Michael Jerris <[email protected]>
Date:   Fri Apr 18 13:42:07 2014 -0400

    postgres 7.1 error message leak

diff --git a/Drivers/Postgre7.1/environ.c b/Drivers/Postgre7.1/environ.c
index edca310..114326d 100644
--- a/Drivers/Postgre7.1/environ.c
+++ b/Drivers/Postgre7.1/environ.c
@@ -83,7 +83,7 @@ SQLRETURN   SQLError(SQLHENV henv,
            SQLCHAR *szErrorMsg, SQLSMALLINT cbErrorMsgMax,
            SQLSMALLINT *pcbErrorMsg)
 {
-char *msg;
+char *msg = NULL;
 int status;
     
 	mylog("**** SQLError: henv=%u, hdbc=%u, hstmt=%u\n", henv, hdbc, hstmt);
@@ -217,7 +217,10 @@ int status;
                 }         
 
 				mylog("       szSqlState = '%s', szError='%s'\n", szSqlState, szErrorMsg);
-            
+
+				if ( msg ) {
+					free(msg);
+				}
         } else {
             if (NULL != szSqlState)
                 strcpy((char*)szSqlState, "00000");

commit bae70e71b4d3fb7f7e0a7e0f1880c015b97f95ee
Author: Michael Jerris <[email protected]>
Date:   Fri Apr 18 13:41:02 2014 -0400

    postgres 7.1 driver leak

diff --git a/Drivers/Postgre7.1/connection.c b/Drivers/Postgre7.1/connection.c
index c8a14e2..d978e73 100644
--- a/Drivers/Postgre7.1/connection.c
+++ b/Drivers/Postgre7.1/connection.c
@@ -234,6 +234,8 @@ ConnectionClass *rv;
 
 		rv->henv = (HENV)NULL; /* not yet associated with an environment */
 
+		rv->__error_message = NULL;
+
         CC_clear_error(rv);
 
         rv->status = CONN_NOT_CONNECTED;
@@ -314,6 +316,8 @@ CC_Destructor(ConnectionClass *self)
 
 	CC_set_errormsg(self, NULL);
 
+	CC_clear_error(self);
+
 	free(self);
 
 	mylog("exit CC_Destructor\n");
@@ -345,6 +349,7 @@ void
 CC_clear_error(ConnectionClass *self)
 {
 	self->__error_number = 0; 
+	if (self->__error_message) free(self->__error_message);
 	self->__error_message = NULL; 
 	self->errormsg_created = FALSE;
 }
@@ -929,8 +934,7 @@ CC_create_errormsg(ConnectionClass *self)
 void
 CC_set_error(ConnectionClass *self, int number, const char *message)
 {
-	if (self->__error_message)
-		free(self->__error_message);
+	CC_clear_error(self);
 	self->__error_number = number;
 	self->__error_message = message ? strdup(message) : NULL;
 }
@@ -939,8 +943,7 @@ CC_set_error(ConnectionClass *self, int number, const char *message)
 void
 CC_set_errormsg(ConnectionClass *self, const char *message)
 {
-	if (self->__error_message)
-		free(self->__error_message);
+	CC_clear_error(self);
 	self->__error_message = message ? strdup(message) : NULL;
 }
 
@@ -955,8 +958,7 @@ CC_get_error(ConnectionClass *self, int *number, char **message)
 	/*	Create a very informative errormsg if it hasn't been done yet. */
 	if ( ! self->errormsg_created) {
 		msgcrt = CC_create_errormsg(self);
-		if (self->__error_message)
-			free(self->__error_message);
+		CC_clear_error(self);
 		self->__error_message = msgcrt;
 		self->errormsg_created = TRUE;
 	}
diff --git a/Drivers/Postgre7.1/statement.c b/Drivers/Postgre7.1/statement.c
index 522cfaf..558ab5d 100644
--- a/Drivers/Postgre7.1/statement.c
+++ b/Drivers/Postgre7.1/statement.c
@@ -209,7 +209,7 @@ SC_Constructor(void)
 		rv->prepare = FALSE;
 		rv->status = STMT_ALLOCATED;
 		rv->internal = FALSE;
-
+		rv->__error_message = NULL;
 		SC_clear_error(rv);
 
 		rv->statement = NULL;
@@ -281,6 +281,7 @@ SC_Destructor(StatementClass *self)
 	if (self->bindings)
 		free(self->bindings);
 
+	SC_clear_error(self);
 
 	/*	Free the parsed table information */
 	if (self->ti) {
@@ -516,6 +517,7 @@ void
 SC_clear_error(StatementClass *self)
 {
 	self->__error_number = 0;
+	if (self->__error_message) free(self->__error_message);
 	self->__error_message = NULL;
 	self->errormsg_created = FALSE;
 }
@@ -573,19 +575,19 @@ SC_create_errormsg(StatementClass *self)
 void
 SC_set_error(StatementClass *self, int number, const char *message)
 {
-	if (self->__error_message)
-		free(self->__error_message);
+	SC_clear_error(self);
 	self->__error_number = number;
 	self->__error_message = message ? strdup(message) : NULL;
+	self->errormsg_created = !!self->__error_message;
 }
 
 
 void
 SC_set_errormsg(StatementClass *self, const char *message)
 {
-	if (self->__error_message)
-		free(self->__error_message);
+	SC_clear_error(self);
 	self->__error_message = message ? strdup(message) : NULL;
+	self->errormsg_created = !!self->__error_message;
 }
 
 
@@ -596,14 +598,17 @@ char rv;
 
 /*	Create a very informative errormsg if it hasn't been done yet. */
 	if ( ! self->errormsg_created) {
-		self->__error_message = SC_create_errormsg(self);
-		self->errormsg_created = TRUE;
+		SC_clear_error(self);
+		if ((self->__error_message = SC_create_errormsg(self))) {
+			self->errormsg_created = TRUE;
+		}
 	}
 
 	if (self->__error_number) {
 		*number = self->__error_number;
 		*message = self->__error_message;
 		self->__error_message = NULL;
+		self->errormsg_created = FALSE;
 	}
 
 	rv = (self->__error_number != 0);

--Apple-Mail=_B84D049B-C62E-40A0-864C-A89BC0370371
Content-Transfer-Encoding: 7bit
Content-Type: text/plain;
	charset=us-ascii






--Apple-Mail=_B84D049B-C62E-40A0-864C-A89BC0370371
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
unixODBC-dev mailing list
[email protected]
http://mailman.unixodbc.org/mailman/listinfo/unixodbc-dev

--Apple-Mail=_B84D049B-C62E-40A0-864C-A89BC0370371--