pgsql: Fix small memory leak in get_dbname_oid_list_from_mfile().

Started by Tom Lane4 months ago4 messagescomitters
Jump to latest
#1Tom Lane
tgl@sss.pgh.pa.us

Fix small memory leak in get_dbname_oid_list_from_mfile().

Coverity complained that this function leaked the dumpdirpath string,
which it did. But we don't need to make a copy at all, because
there's not really any point in trimming trailing slashes from the
directory name here. If that were needed, the initial
file_exists_in_directory() test would have failed, since it doesn't
bother with that (and neither does anyplace else in this file).
Moreover, if we did want that, reimplementing canonicalize_path()
poorly is not the way to proceed. Arguably, all of this code should
be reexamined with an eye to using src/port/path.c's facilities, but
for today I'll settle for getting rid of the memory leak.

Branch
------
master

Details
-------
https://git.postgresql.org/pg/commitdiff/bb53b8d359d33f10b6274be743c42f6e8ecfbb84

Modified Files
--------------
src/bin/pg_dump/pg_restore.c | 16 +++-------------
1 file changed, 3 insertions(+), 13 deletions(-)

#2Mahendra Singh Thalor
mahi6run@gmail.com
In reply to: Tom Lane (#1)
Re: pgsql: Fix small memory leak in get_dbname_oid_list_from_mfile().

Thanks Tom for fixing this memory leak.

On Mon, 16 Mar 2026 at 00:54, Tom Lane <tgl@sss.pgh.pa.us> wrote:

Fix small memory leak in get_dbname_oid_list_from_mfile().

Coverity complained that this function leaked the dumpdirpath string,
which it did. But we don't need to make a copy at all, because
there's not really any point in trimming trailing slashes from the
directory name here. If that were needed, the initial
file_exists_in_directory() test would have failed, since it doesn't
bother with that (and neither does anyplace else in this file).
Moreover, if we did want that, reimplementing canonicalize_path()
poorly is not the way to proceed. Arguably, all of this code should
be reexamined with an eye to using src/port/path.c's facilities, but
for today I'll settle for getting rid of the memory leak.

Branch
------
master

Details
-------

https://git.postgresql.org/pg/commitdiff/bb53b8d359d33f10b6274be743c42f6e8ecfbb84

Modified Files
--------------
src/bin/pg_dump/pg_restore.c | 16 +++-------------
1 file changed, 3 insertions(+), 13 deletions(-)

We were trimming slashes due to the below test case.

*Ex:*
./pg_dumpall -f dumpdir --format=d

./pg_restore *dumpdir/ *-d postgres -C --format=d --verbose
pg_restore: found database "template1" (OID: 1) in file "*dumpdir//map.dat*"
pg_restore: found database "postgres" (OID: 5) in file "*dumpdir//map.dat*"
pg_restore: found 2 database names in "map.dat"
pg_restore: need to restore 2 databases out of 2 databases

Here, before map.dat, there were 2 slashes so we were trimming slashes.
Please add your opinion for this output.

--
Thanks and Regards
Mahendra Singh Thalor
EnterpriseDB: http://www.enterprisedb.com

#3Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Mahendra Singh Thalor (#2)
Re: pgsql: Fix small memory leak in get_dbname_oid_list_from_mfile().

On 2026-Mar-16, Mahendra Singh Thalor wrote:

We were trimming slashes due to the below test case.

*Ex:*
./pg_dumpall -f dumpdir --format=d

./pg_restore *dumpdir/ *-d postgres -C --format=d --verbose
pg_restore: found database "template1" (OID: 1) in file "*dumpdir//map.dat*"
pg_restore: found database "postgres" (OID: 5) in file "*dumpdir//map.dat*"
pg_restore: found 2 database names in "map.dat"
pg_restore: need to restore 2 databases out of 2 databases

Here, before map.dat, there were 2 slashes so we were trimming slashes.
Please add your opinion for this output.

I think this is perfectly fine. Two slashes work correctly, and many
other tools behave this way when given redundant slashes. If the user
doesn't want to see the redundant slashes, they can just not specify a
trailing slash in the argument value.

--
Álvaro Herrera PostgreSQL Developer — https://www.EnterpriseDB.com/
"¿Cómo puedes confiar en algo que pagas y que no ves,
y no confiar en algo que te dan y te lo muestran?" (Germán Poo)

#4Tom Lane
tgl@sss.pgh.pa.us
In reply to: Alvaro Herrera (#3)
Re: pgsql: Fix small memory leak in get_dbname_oid_list_from_mfile().

=?utf-8?Q?=C3=81lvaro?= Herrera <alvherre@kurilemu.de> writes:

On 2026-Mar-16, Mahendra Singh Thalor wrote:

We were trimming slashes due to the below test case.

*Ex:*
./pg_dumpall -f dumpdir --format=d

./pg_restore *dumpdir/ *-d postgres -C --format=d --verbose
pg_restore: found database "template1" (OID: 1) in file "*dumpdir//map.dat*"
pg_restore: found database "postgres" (OID: 5) in file "*dumpdir//map.dat*"
pg_restore: found 2 database names in "map.dat"
pg_restore: need to restore 2 databases out of 2 databases

Here, before map.dat, there were 2 slashes so we were trimming slashes.
Please add your opinion for this output.

I think this is perfectly fine. Two slashes work correctly, and many
other tools behave this way when given redundant slashes. If the user
doesn't want to see the redundant slashes, they can just not specify a
trailing slash in the argument value.

As I said in my commit message, if we wanted to do something about
this the correct thing would be to apply canonicalize_path to the
constructed strings. On Unix systems that's really just cosmetic, as
Alvaro says. But if memory serves it's not necessarily so on Windows.
Has anyone tested this patch on Windows, with Windows peculiarities
like using backslash separators in the given path?

regards, tom lane