From 956cbeb7ef1c84db9ea6078145b37ac0fea2fa7c Mon Sep 17 00:00:00 2001
From: Michael Meskes <meskes@postgresql.org>
Date: Wed, 5 Jul 2006 10:49:56 +0000
Subject: [PATCH] Fixed remaining Coverity bugs.

---
 src/interfaces/ecpg/ChangeLog            |  4 ++++
 src/interfaces/ecpg/ecpglib/descriptor.c | 11 +++++++----
 src/interfaces/ecpg/ecpglib/execute.c    | 25 ++++++++++++++++++------
 3 files changed, 30 insertions(+), 10 deletions(-)

diff --git a/src/interfaces/ecpg/ChangeLog b/src/interfaces/ecpg/ChangeLog
index 8196449cf45..a89722bb647 100644
--- a/src/interfaces/ecpg/ChangeLog
+++ b/src/interfaces/ecpg/ChangeLog
@@ -2040,5 +2040,9 @@ Mo Jun 26 16:08:23 CEST 2006
 
 	- Added missing braces to prevent a segfault after usage of an
 	  undeclared cursor.
+
+We Jul  5 12:17:28 CEST 2006
+
+	- Fixed remaining Coverity bugs.
 	- Set ecpg library version to 5.2.
 	- Set ecpg version to 4.2.1.
diff --git a/src/interfaces/ecpg/ecpglib/descriptor.c b/src/interfaces/ecpg/ecpglib/descriptor.c
index 9a3086bdda7..c0ee7684c39 100644
--- a/src/interfaces/ecpg/ecpglib/descriptor.c
+++ b/src/interfaces/ecpg/ecpglib/descriptor.c
@@ -1,6 +1,6 @@
 /* dynamic SQL support routines
  *
- * $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/descriptor.c,v 1.16 2006/06/25 09:38:39 meskes Exp $
+ * $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/descriptor.c,v 1.17 2006/07/05 10:49:56 meskes Exp $
  */
 
 #define POSTGRES_ECPG_INTERNAL
@@ -249,7 +249,7 @@ ECPGget_desc(int lineno, const char *desc_name, int index,...)
 				data_var.ind_varcharsize = varcharsize;
 				data_var.ind_arrsize = arrsize;
 				data_var.ind_offset = offset;
-				if (data_var.ind_arrsize == 0 || data_var.ind_varcharsize == 0)
+				if ((data_var.ind_arrsize == 0 || data_var.ind_varcharsize == 0) && data_var.ind_pointer != NULL)
 					data_var.ind_value = *((void **) (data_var.ind_pointer));
 				else
 					data_var.ind_value = data_var.ind_pointer;
@@ -397,7 +397,8 @@ ECPGget_desc(int lineno, const char *desc_name, int index,...)
 		setlocale(LC_NUMERIC, oldlocale);
 		ECPGfree(oldlocale);
 	}
-	else if (data_var.ind_type != ECPGt_NO_INDICATOR)
+	else if (data_var.ind_type != ECPGt_NO_INDICATOR && data_var.ind_pointer != NULL)
+	/* ind_type != NO_INDICATOR should always have ind_pointer != NULL but since this might be changed manually in the .c file let's play it safe */
 	{
 		/*
 		 * this is like ECPGstore_result but since we don't have a data
@@ -410,8 +411,9 @@ ECPGget_desc(int lineno, const char *desc_name, int index,...)
 			ECPGraise(lineno, ECPG_TOO_MANY_MATCHES, ECPG_SQLSTATE_CARDINALITY_VIOLATION, NULL);
 			return false;
 		}
+
 		/* allocate storage if needed */
-		if (data_var.ind_arrsize == 0 && data_var.ind_pointer != NULL && data_var.ind_value == NULL)
+		if (data_var.ind_arrsize == 0 && data_var.ind_value == NULL)
 		{
 			void *mem = (void *) ECPGalloc(data_var.ind_offset * ntuples, lineno);
 			if (!mem)
@@ -420,6 +422,7 @@ ECPGget_desc(int lineno, const char *desc_name, int index,...)
 			ECPGadd_mem(mem, lineno);
 			data_var.ind_value = mem;
 		}
+
 		for (act_tuple = 0; act_tuple < ntuples; act_tuple++)
 		{
 			if (!get_int_item(lineno, data_var.ind_value, data_var.ind_type, -PQgetisnull(ECPGresult, act_tuple, index)))
diff --git a/src/interfaces/ecpg/ecpglib/execute.c b/src/interfaces/ecpg/ecpglib/execute.c
index 0ac6b909807..348b652f8ac 100644
--- a/src/interfaces/ecpg/ecpglib/execute.c
+++ b/src/interfaces/ecpg/ecpglib/execute.c
@@ -1,4 +1,4 @@
-/* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/execute.c,v 1.50 2006/06/26 09:20:09 meskes Exp $ */
+/* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/execute.c,v 1.51 2006/07/05 10:49:56 meskes Exp $ */
 
 /*
  * The aim is to get a simpler inteface to the database routines.
@@ -876,12 +876,13 @@ ECPGstore_input(const int lineno, const bool force_indicator, const struct varia
 				{
 					char	   *str = NULL;
 					int	    slen;
-					numeric    *nval = PGTYPESnumeric_new();
+					numeric    *nval;
 
 					if (var->arrsize > 1)
 					{
-						for (element = 0; element < var->arrsize; element++, nval = PGTYPESnumeric_new())
+						for (element = 0; element < var->arrsize; element++)
 						{
+							nval = PGTYPESnumeric_new();
 							if (!nval)
 								return false;
 								
@@ -911,6 +912,7 @@ ECPGstore_input(const int lineno, const bool force_indicator, const struct varia
 					}
 					else
 					{
+						nval = PGTYPESnumeric_new();
 						if (!nval)
 							return false;
 
@@ -1048,16 +1050,22 @@ ECPGstore_input(const int lineno, const bool force_indicator, const struct varia
 
 			case ECPGt_timestamp:
 				{
-					char	   *str = NULL;
+					char	   *str = NULL, *asc = NULL;
 					int			slen;
 
 					if (var->arrsize > 1)
 					{
 						for (element = 0; element < var->arrsize; element++)
 						{
-							str = quote_postgres(PGTYPEStimestamp_to_asc(*(timestamp *) ((var + var->offset * element)->value)), lineno);
+							asc = PGTYPEStimestamp_to_asc(*(timestamp *) ((var + var->offset * element)->value));
+							if (!asc)
+								return false;
+
+							str = quote_postgres(asc, lineno);
+							ECPGfree(asc); /* we don't need this anymore so free it asap. */
 							if (!str)
 								return false;
+
 							slen = strlen(str);
 
 							if (!(mallocedval = ECPGrealloc(mallocedval, strlen(mallocedval) + slen + sizeof("array [], timestamp "), lineno)))
@@ -1077,7 +1085,12 @@ ECPGstore_input(const int lineno, const bool force_indicator, const struct varia
 					}
 					else
 					{
-						str = quote_postgres(PGTYPEStimestamp_to_asc(*(timestamp *) (var->value)), lineno);
+						asc = PGTYPEStimestamp_to_asc(*(timestamp *) (var->value));
+						if (!asc)
+							return false;
+
+						str = quote_postgres(asc, lineno);
+						ECPGfree(asc); /* we don't need this anymore so free it asap. */
 						if (!str)
 							return false;
 						slen = strlen(str);
-- 
GitLab