public inbox for [email protected]help / color / mirror / Atom feed
[PATCH v16 02/10] pg_stat_file and pg_ls_dir_* to use lstat().. 2+ messages / 2 participants [nested] [flat]
* [PATCH v16 02/10] pg_stat_file and pg_ls_dir_* to use lstat().. @ 2020-03-30 23:59 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 2+ messages in thread From: Justin Pryzby @ 2020-03-30 23:59 UTC (permalink / raw) pg_ls_dir_* will now skip (no longer show) symbolic links, same as other non-regular file types, as we advertize we do since 8b6d94cf6. That seems to be the intented behavior, since irregular file types are 1) less portable; and, 2) we don't currently show a file's type except for "bool is_dir". pg_stat_file will now 1) show metadata of links themselves, rather than their target; and, 2) specifically, show links to directories with "is_dir=false"; and, 3) not error on broken symlinks. --- doc/src/sgml/func.sgml | 2 +- src/backend/utils/adt/genfile.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml index 9b885102da..96b08d0500 100644 --- a/doc/src/sgml/func.sgml +++ b/doc/src/sgml/func.sgml @@ -25486,7 +25486,7 @@ SELECT convert_from(pg_read_binary_file('file_in_utf8.txt'), 'UTF8'); size, last accessed time stamp, last modified time stamp, last file status change time stamp (Unix platforms only), file creation time stamp (Windows only), and a <type>boolean</type> - indicating if it is a directory (or a symbolic link to a directory). + indicating if it is a directory. Typical usages include: <programlisting> SELECT * FROM pg_stat_file('filename'); diff --git a/src/backend/utils/adt/genfile.c b/src/backend/utils/adt/genfile.c index ceaa6180da..219ac160f8 100644 --- a/src/backend/utils/adt/genfile.c +++ b/src/backend/utils/adt/genfile.c @@ -370,7 +370,7 @@ pg_stat_file(PG_FUNCTION_ARGS) filename = convert_and_check_filename(filename_t); - if (stat(filename, &fst) < 0) + if (lstat(filename, &fst) < 0) { if (missing_ok && errno == ENOENT) PG_RETURN_NULL(); @@ -596,7 +596,7 @@ pg_ls_dir_files(FunctionCallInfo fcinfo, const char *dir, bool missing_ok) /* Get the file info */ snprintf(path, sizeof(path), "%s/%s", dir, de->d_name); - if (stat(path, &attrib) < 0) + if (lstat(path, &attrib) < 0) { /* Ignore concurrently-deleted files, else complain */ if (errno == ENOENT) -- 2.17.0 --2FkSFaIQeDFoAt0B Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v16-0003-Add-tests-on-pg_ls_dir-before-changing-it.patch" ^ permalink raw reply [nested|flat] 2+ messages in thread
* [BUG] psql: Make \copy from 'text' and 'csv' formats fail on NUL bytes @ 2024-11-10 21:26 Joel Jacobson <[email protected]> 0 siblings, 0 replies; 2+ messages in thread From: Joel Jacobson @ 2024-11-10 21:26 UTC (permalink / raw) To: [email protected] Hi hackers, When using \copy from in psql to import files containing NUL bytes (\0) in 'text' or 'csv' format, the NUL bytes were not detected and did not result in an error, leading to silent data corruption. This behavior is inconsistent with server-side COPY FROM, which reports an error upon encountering NUL bytes in the 'text' and 'csv' formats. Fix by adjusting handleCopyIn() to use the binary code path also when the copy source is a file (i.e., copystream != pset.cur_cmd_source), even in textual copies. This ensures that NUL bytes are detected and reported in the same way as server-side COPY. Example: % printf 'test_col\nfoo\n\x00\nbar\nbaz\x00aar\nbizarre\n' > nul_bytes.data % cat -v nul_bytes.data test_col foo ^@ bar baz^@aar bizarre % psql create table nul_bytes_test (test_col text); -- -- HEAD -- \copy nul_bytes_test (test_col) from 'nul_bytes.data' (format csv, header match); COPY 3 select * from nul_bytes_test; test_col ------------ foo bar bazbizarre (3 rows) \copy nul_bytes_test (test_col) from 'nul_bytes.data' (format text, header match); select * from nul_bytes_test; test_col ------------ foo bar bazbizarre (3 rows) -- -- 0001-psql-Make-copy-from-text-and-csv-formats-fail-on-NUL.patch -- \copy nul_bytes_test (test_col) from 'nul_bytes.data' (format csv, header match); ERROR: invalid byte sequence for encoding "UTF8": 0x00 CONTEXT: COPY nul_bytes_test, line 3 \copy nul_bytes_test (test_col) from 'nul_bytes.data' (format text, header match); ERROR: invalid byte sequence for encoding "UTF8": 0x00 CONTEXT: COPY nul_bytes_test, line 3 /Joel Attachments: [application/octet-stream] 0001-psql-Make-copy-from-text-and-csv-formats-fail-on-NUL.patch (1.3K, ../../[email protected]/2-0001-psql-Make-copy-from-text-and-csv-formats-fail-on-NUL.patch) download | inline diff: From b6824faf03d4d4bdb909b33230fab0011cbcfc69 Mon Sep 17 00:00:00 2001 From: Joel Jacobson <[email protected]> Date: Sun, 10 Nov 2024 22:18:48 +0100 Subject: [PATCH] psql: Make \copy from 'text' and 'csv' formats fail on NUL bytes When using \copy from in psql to import files containing NUL bytes (\0) in 'text' or 'csv' format, the NUL bytes were not detected and did not result in an error, leading to silent data corruption. This behavior is inconsistent with server-side COPY FROM, which reports an error upon encountering NUL bytes in the 'text' and 'csv' formats. Fix by adjusting handleCopyIn() to use the binary code path also when the copy source is a file (i.e., copystream != pset.cur_cmd_source), even in textual copies. This ensures that NUL bytes are detected and reported in the same way as server-side COPY. --- src/bin/psql/copy.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bin/psql/copy.c b/src/bin/psql/copy.c index e020e4d665d..306f5161e1d 100644 --- a/src/bin/psql/copy.c +++ b/src/bin/psql/copy.c @@ -544,7 +544,7 @@ handleCopyIn(PGconn *conn, FILE *copystream, bool isbinary, PGresult **res) OK = true; - if (isbinary) + if (isbinary || copystream != pset.cur_cmd_source) { /* interactive input probably silly, but give one prompt anyway */ if (showprompt) -- 2.45.1 ^ permalink raw reply [nested|flat] 2+ messages in thread
end of thread, other threads:[~2024-11-10 21:26 UTC | newest] Thread overview: 2+ messages (download: mbox mbox.gz follow: Atom feed) -- links below jump to the message on this page -- 2020-03-30 23:59 [PATCH v16 02/10] pg_stat_file and pg_ls_dir_* to use lstat().. Justin Pryzby <[email protected]> 2024-11-10 21:26 [BUG] psql: Make \copy from 'text' and 'csv' formats fail on NUL bytes Joel Jacobson <[email protected]>
This inbox is served by agora; see mirroring instructions for how to clone and mirror all data and code used for this inbox