BUG #15103: Do not use pfree() to free pg_malloc() return value in vacuum_one_database()

Started by PG Bug reporting formabout 8 years ago2 messagesbugs
Jump to latest
#1PG Bug reporting form
noreply@postgresql.org

The following bug has been logged on the website:

Bug reference: 15103
Logged by: Pan Bian
Email address: bianpan2016@163.com
PostgreSQL version: 10.3
Operating system: Linux
Description:

File: src/bin/scripts/vacuumdb.c
Function: vacuum_one_database()

Details: In function vacuum_one_database(), the memory allocated with
pg_malloc() (at line 435), but the return value is freed with pfree() (at
line 530). I think use the function pg_free() paired with pg_malloc() is
better here.

For your convenience, I paste related bugs as follows:

334 static void
335 vacuum_one_database(const char *dbname, vacuumingOptions *vacopts,
336 int stage,
337 SimpleStringList *tables,
338 const char *host, const char *port,
339 const char *username, enum trivalue
prompt_password,
340 int concurrentCons,
341 const char *progname, bool echo, bool quiet)
342 {
343 PQExpBufferData sql;
344 PGconn *conn;
345 SimpleStringListCell *cell;
346 ParallelSlot *slots = NULL;
...
435 slots = (ParallelSlot *) pg_malloc(sizeof(ParallelSlot) *
concurrentCons);
436 init_slot(slots, conn, progname);
437 if (parallel)
438 {
439 for (i = 1; i < concurrentCons; i++)
440 {
441 conn = connectDatabase(dbname, host, port, username,
prompt_password,
442 progname, echo, false, true);
443 init_slot(slots + i, conn, progname);
444 }
445 }
...
527 finish:
528 for (i = 0; i < concurrentCons; i++)
529 DisconnectDatabase(slots + i);
530 pfree(slots);
531
532 termPQExpBuffer(&sql);
533
534 if (failed)
535 exit(1);
536 }

#2Michael Paquier
michael@paquier.xyz
In reply to: PG Bug reporting form (#1)
Re: BUG #15103: Do not use pfree() to free pg_malloc() return value in vacuum_one_database()

On Fri, Mar 09, 2018 at 01:32:47AM +0000, PG Bug reporting form wrote:

Details: In function vacuum_one_database(), the memory allocated with
pg_malloc() (at line 435), but the return value is freed with pfree() (at
line 530). I think use the function pg_free() paired with pg_malloc() is
better here.

In practice it does not matter much as pfree is just a wrapper on top of
pg_free(). Please see fe_memutils.c, which lists all the memory-related
APIs for frontends.
--
Michael