Обсуждение: pgsql: Fix small memory leak in get_dbname_oid_list_from_mfile().
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:
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.
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.
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)
=?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