pgsql: Avoid holding a directory FD open across pg_ls_dir_files() calls

From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: pgsql-committers(at)lists(dot)postgresql(dot)org
Subject: pgsql: Avoid holding a directory FD open across pg_ls_dir_files() calls
Date: 2020-03-11 19:28:24
Message-ID: E1jC71k-0001WI-S1@gemulon.postgresql.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-committers

Avoid holding a directory FD open across pg_ls_dir_files() calls.

This coding technique is undesirable because (a) it leaks the FD for
the rest of the transaction if the SRF is not run to completion, and
(b) allocated FDs are a scarce resource, but multiple interleaved
uses of the relevant functions could eat many such FDs.

In v11 and later, a query such as "SELECT pg_ls_waldir() LIMIT 1"
yields a warning about the leaked FD, and the only reason there's
no warning in earlier branches is that fd.c didn't whine about such
leaks before commit 9cb7db3f0. Even disregarding the warning, it
wouldn't be too hard to run a backend out of FDs with careless use
of these SQL functions.

Hence, rewrite the function so that it reads the directory within
a single call, returning the results as a tuplestore rather than
via value-per-call mode.

There are half a dozen other built-in SRFs with similar problems,
but let's fix this one to start with, just to see if the buildfarm
finds anything wrong with the code.

In passing, fix bogus error report for stat() failure: it was
whining about the directory when it should be fingering the
individual file. Doubtless a copy-and-paste error.

Back-patch to v10 where this function was added.

Justin Pryzby, with cosmetic tweaks and test cases by me

Discussion: https://postgr.es/m/20200308173103.GC1357@telsasoft.com

Branch
------
master

Details
-------
https://git.postgresql.org/pg/commitdiff/085b6b6679e73b9b386f209b4d625c7bc60597c0

Modified Files
--------------
src/backend/utils/adt/genfile.c | 97 +++++++++++++++-------------
src/test/regress/expected/misc_functions.out | 46 +++++++++++++
src/test/regress/sql/misc_functions.sql | 20 ++++++
3 files changed, 118 insertions(+), 45 deletions(-)

Browse pgsql-committers by date

  From Date Subject
Next Message Alvaro Herrera 2020-03-11 19:58:54 pgsql: Add pg_dump support for ALTER obj DEPENDS ON EXTENSION
Previous Message Peter Eisentraut 2020-03-11 15:44:28 pgsql: Refactor ps_status.c API