Hello, Michael

> I don't know how you did it, but this email has visibly broken the
> original thread. Did you change the topic name?

I'm very sorry for this. I had no local copy of this thread. So I wrote a
new email with the same subject hoping it will be OK. Apparently right
In-Reply-To header is also required. 

>   if (prodesc->user_proname == NULL || prodesc->internal_proname == NULL)
> + {
> +    free(prodesc);

I think that prodesc->user_proname and prodesc->internal_proname should
also be freed if they are not NULL's.

> By the way maybe someone knows other procedures besides malloc, realloc
> and strdup that require special attention?

I recalled that there is also calloc(). I've found four places that use
calloc() and look suspicious to me (see attachment). What do you think -
are these bugs or not?

-- 
Best regards,
Aleksander Alekseev
Looks like resource leak:

./src/backend/storage/buffer/localbuf.c:    LocalBufferDescriptors = 
(BufferDesc *) calloc(nbufs, sizeof(BufferDesc));
./src/backend/storage/buffer/localbuf.c:    LocalBufferBlockPointers = (Block 
*) calloc(nbufs, sizeof(Block));
./src/backend/storage/buffer/localbuf.c:    LocalRefCount = (int32 *) 
calloc(nbufs, sizeof(int32));
./src/backend/storage/buffer/localbuf.c-    if (!LocalBufferDescriptors || 
!LocalBufferBlockPointers || !LocalRefCount)
./src/backend/storage/buffer/localbuf.c-        ereport(FATAL,
./src/backend/storage/buffer/localbuf.c-                
(errcode(ERRCODE_OUT_OF_MEMORY),
./src/backend/storage/buffer/localbuf.c-                 errmsg("out of 
memory")));
./src/backend/storage/buffer/localbuf.c-

./src/interfaces/libpq/fe-print.c-      nTups = PQntuples(res);
./src/interfaces/libpq/fe-print.c:      if (!(fieldNames = (const char **) 
calloc(nFields, sizeof(char *))))
./src/interfaces/libpq/fe-print.c-      {
./src/interfaces/libpq/fe-print.c-          fprintf(stderr, libpq_gettext("out 
of memory\n"));
./src/interfaces/libpq/fe-print.c-          abort();
./src/interfaces/libpq/fe-print.c-      }
./src/interfaces/libpq/fe-print.c:      if (!(fieldNotNum = (unsigned char *) 
calloc(nFields, 1)))
./src/interfaces/libpq/fe-print.c-      {
./src/interfaces/libpq/fe-print.c-          fprintf(stderr, libpq_gettext("out 
of memory\n"));
./src/interfaces/libpq/fe-print.c-          abort();
./src/interfaces/libpq/fe-print.c-      }
./src/interfaces/libpq/fe-print.c:      if (!(fieldMax = (int *) 
calloc(nFields, sizeof(int))))
./src/interfaces/libpq/fe-print.c-      {
./src/interfaces/libpq/fe-print.c-          fprintf(stderr, libpq_gettext("out 
of memory\n"));
./src/interfaces/libpq/fe-print.c-          abort();
./src/interfaces/libpq/fe-print.c-      }


Two identical pieces of code:

./src/backend/bootstrap/bootstrap.c-            scan = 
heap_beginscan_catalog(rel, 0, NULL);
./src/backend/bootstrap/bootstrap.c-            i = 0;
./src/backend/bootstrap/bootstrap.c-            while ((tup = 
heap_getnext(scan, ForwardScanDirection)) != NULL)
./src/backend/bootstrap/bootstrap.c-                    ++i;
./src/backend/bootstrap/bootstrap.c-            heap_endscan(scan);
./src/backend/bootstrap/bootstrap.c:            app = Typ = ALLOC(struct typmap 
*, i + 1);
./src/backend/bootstrap/bootstrap.c-            while (i-- > 0)
./src/backend/bootstrap/bootstrap.c:                    *app++ = ALLOC(struct 
typmap, 1);
./src/backend/bootstrap/bootstrap.c-            *app = NULL;
./src/backend/bootstrap/bootstrap.c-            scan = 
heap_beginscan_catalog(rel, 0, NULL);
./src/backend/bootstrap/bootstrap.c-            app = Typ;
./src/backend/bootstrap/bootstrap.c-            while ((tup = 
heap_getnext(scan, ForwardScanDirection)) != NULL)
./src/backend/bootstrap/bootstrap.c-            {


./src/backend/bootstrap/bootstrap.c-            scan = 
heap_beginscan_catalog(rel, 0, NULL);
./src/backend/bootstrap/bootstrap.c-            i = 0;
./src/backend/bootstrap/bootstrap.c-            while ((tup = 
heap_getnext(scan, ForwardScanDirection)) != NULL)
./src/backend/bootstrap/bootstrap.c-                    ++i;
./src/backend/bootstrap/bootstrap.c-            heap_endscan(scan);
./src/backend/bootstrap/bootstrap.c:            app = Typ = ALLOC(struct typmap 
*, i + 1);
./src/backend/bootstrap/bootstrap.c-            while (i-- > 0)
./src/backend/bootstrap/bootstrap.c:                    *app++ = ALLOC(struct 
typmap, 1);
./src/backend/bootstrap/bootstrap.c-            *app = NULL;
./src/backend/bootstrap/bootstrap.c-            scan = 
heap_beginscan_catalog(rel, 0, NULL);
./src/backend/bootstrap/bootstrap.c-            app = Typ;
./src/backend/bootstrap/bootstrap.c-            while ((tup = 
heap_getnext(scan, ForwardScanDirection)) != NULL)
./src/backend/bootstrap/bootstrap.c-            {
-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to