]> granicus.if.org Git - postgresql/commitdiff
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:58:16 +0000 (13:58 +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 542ca427328fcbd5e4c6cedf67f9f4970a72e81d..21f61ab05e4f3bfee8289ed9362c1d23931c4c7d 100644 (file)
@@ -410,12 +410,11 @@ 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)
                                                return false;
                                        *(void **) var = mem;
-                                       ecpg_add_mem(mem, lineno);
                                        var = mem;
                                }
 
@@ -480,12 +479,11 @@ 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)
                                return false;
                        *(void **) data_var.ind_pointer = mem;
-                       ecpg_add_mem(mem, lineno);
                        data_var.ind_value = mem;
                }
 
index 9bdc09413b6ff13811e0e397e9b895e4eeea8a8c..70cfa3f3a695d2525a72c18fd1da1a62da992fc4 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 1e8f18f965ca7070ad5cb976cbd02b1fb8d8e358..ea32934287fcf4231e81c97b43efda5fb65c885c 100644 (file)
@@ -124,8 +124,7 @@ struct variable
 
 /* 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,
@@ -136,6 +135,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 63b57177ec2c732eb5ab05616afeec4488f5dce8..e0b62ae34cd0d7697d8652eace215051ded70067 100644 (file)
@@ -103,14 +103,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