Обсуждение: pgsql: Fix small memory leak in get_dbname_oid_list_from_mfile().

Поиск
Список
Период
Сортировка

pgsql: Fix small memory leak in get_dbname_oid_list_from_mfile().

От
Tom Lane
Дата:
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(-)


Re: pgsql: Fix small memory leak in get_dbname_oid_list_from_mfile().

От
Mahendra Singh Thalor
Дата:
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

Re: pgsql: Fix small memory leak in get_dbname_oid_list_from_mfile().

От
Álvaro Herrera
Дата:
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)



Re: pgsql: Fix small memory leak in get_dbname_oid_list_from_mfile().

От
Tom Lane
Дата:
=?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