Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
This routine was calling ecpg_alloc to allocate to memory but did not
authorMichael Meskes <meskes@postgresql.org>
Thu, 5 Feb 2015 14:12:34 +0000 (15:12 +0100)
committerMichael Meskes <meskes@postgresql.org>
Wed, 12 Aug 2015 11:57:41 +0000 (13:57 +0200)
actually check the returned pointer allocated, potentially NULL which
could be the result of a malloc call.

Issue noted by Coverity, fixed by Michael Paquier <michael@otacoo.com>

src/interfaces/ecpg/ecpglib/descriptor.c
src/interfaces/ecpg/ecpglib/execute.c
src/interfaces/ecpg/ecpglib/extern.h
src/interfaces/ecpg/ecpglib/memory.c

index ff011bd81654d350ca67708497ad842ae4432d17..15fd7a08a53108102a45fc2dc9dd50a54e96fa12 100644 (file)
@@ -446,7 +446,7 @@ ECPGget_desc(int lineno, const char *desc_name, int index,...)
                /* allocate storage if needed */
                if (arrsize == 0 && *(void **) var == NULL)
                {
-                   void       *mem = (void *) ecpg_alloc(offset * ntuples, lineno);
+                   void       *mem = (void *) ecpg_auto_alloc(offset * ntuples, lineno);
 
                    if (!mem)
                    {
@@ -454,7 +454,6 @@ ECPGget_desc(int lineno, const char *desc_name, int index,...)
                        return false;
                    }
                    *(void **) var = mem;
-                   ecpg_add_mem(mem, lineno);
                    var = mem;
                }
 
@@ -524,7 +523,7 @@ ECPGget_desc(int lineno, const char *desc_name, int index,...)
        /* allocate storage if needed */
        if (data_var.ind_arrsize == 0 && data_var.ind_value == NULL)
        {
-           void       *mem = (void *) ecpg_alloc(data_var.ind_offset * ntuples, lineno);
+           void       *mem = (void *) ecpg_auto_alloc(data_var.ind_offset * ntuples, lineno);
 
            if (!mem)
            {
@@ -532,7 +531,6 @@ ECPGget_desc(int lineno, const char *desc_name, int index,...)
                return false;
            }
            *(void **) data_var.ind_pointer = mem;
-           ecpg_add_mem(mem, lineno);
            data_var.ind_value = mem;
        }
 
index 1f62b693e3b076a6330e6febbe0ce673226919ba..31ea5db6b76ff4262edcb79512578a37beb35990 100644 (file)
@@ -402,11 +402,10 @@ ecpg_store_result(const PGresult *results, int act_field,
        }
 
        ecpg_log("ecpg_store_result on line %d: allocating memory for %d tuples\n", stmt->lineno, ntuples);
-       var->value = (char *) ecpg_alloc(len, stmt->lineno);
+       var->value = (char *) ecpg_auto_alloc(len, stmt->lineno);
        if (!var->value)
            return false;
        *((char **) var->pointer) = var->value;
-       ecpg_add_mem(var->value, stmt->lineno);
    }
 
    /* allocate indicator variable if needed */
@@ -414,11 +413,10 @@ ecpg_store_result(const PGresult *results, int act_field,
    {
        int         len = var->ind_offset * ntuples;
 
-       var->ind_value = (char *) ecpg_alloc(len, stmt->lineno);
+       var->ind_value = (char *) ecpg_auto_alloc(len, stmt->lineno);
        if (!var->ind_value)
            return false;
        *((char **) var->ind_pointer) = var->ind_value;
-       ecpg_add_mem(var->ind_value, stmt->lineno);
    }
 
    /* fill the variable with the tuple(s) */
index 835e70c38f4d0767baa837d3265ae0633c90a2d3..7583529874bcb60ee76af4f931fb314ff9b11c1b 100644 (file)
@@ -132,8 +132,7 @@ extern struct var_list *ivlist;
 
 /* Here are some methods used by the lib. */
 
-/* Returns a pointer to a string containing a simple type name. */
-void       ecpg_add_mem(void *ptr, int lineno);
+bool       ecpg_add_mem(void *ptr, int lineno);
 
 bool ecpg_get_data(const PGresult *, int, int, int, enum ECPGttype type,
              enum ECPGttype, char *, char *, long, long, long,
@@ -144,6 +143,7 @@ void        ecpg_pthreads_init(void);
 #endif
 struct connection *ecpg_get_connection(const char *);
 char      *ecpg_alloc(long, int);
+char      *ecpg_auto_alloc(long, int);
 char      *ecpg_realloc(void *, long, int);
 void       ecpg_free(void *);
 bool       ecpg_init(const struct connection *, const char *, const int);
index a09cd26a542e4ce250f549b428ac74164d11593a..dffc3a76187ff28b298b07eace460b74e637146c 100644 (file)
@@ -104,14 +104,34 @@ static struct auto_mem *auto_allocs = NULL;
 #define set_auto_allocs(am)        do { auto_allocs = (am); } while(0)
 #endif
 
-void
+char *
+ecpg_auto_alloc(long size, int lineno)
+{
+   void    *ptr = (void *) ecpg_alloc(size, lineno);
+
+   if (!ptr)
+       return NULL;
+
+   if (!ecpg_add_mem(ptr, lineno))
+   {
+       ecpg_free(ptr);
+       return NULL;
+   }
+   return ptr;
+}
+
+bool
 ecpg_add_mem(void *ptr, int lineno)
 {
    struct auto_mem *am = (struct auto_mem *) ecpg_alloc(sizeof(struct auto_mem), lineno);
 
+   if (!am)
+       return false;
+
    am->pointer = ptr;
    am->next = get_auto_allocs();
    set_auto_allocs(am);
+   return true;
 }
 
 void