Thread
Commits
-
Avoid using %c printf format for potentially non-ASCII characters.
- 16e3ad5d1437 14.0 landed
-
bugfix: invalid bit/varbit input causes the log file to be unreadable
Quan Zongliang <quanzongliang@gmail.com> — 2020-06-26T06:44:40Z
The bit/varbit type input functions cause file_fdw to fail to read the logfile normally. 1. Server conf: server_encoding = UTF8 locale = zh_CN.UTF-8 2. Create external tables using file_fdw CREATE EXTENSION file_fdw; CREATE SERVER pglog FOREIGN DATA WRAPPER file_fdw; CREATE FOREIGN TABLE pglog ( log_time timestamp(3) with time zone, user_name text, database_name text, process_id integer, connection_from text, session_id text, session_line_num bigint, command_tag text, session_start_time timestamp with time zone, virtual_transaction_id text, transaction_id bigint, error_severity text, sql_state_code text, message text, detail text, hint text, internal_query text, internal_query_pos integer, context text, query text, query_pos integer, location text, application_name text ) SERVER pglog OPTIONS ( filename 'log/postgresql-2020-06-16_213409.csv', format 'csv'); It's normal to be here. 3. bit/varbit input select b'Ù'; The foreign table cannot be accessed. SELECT * FROM pglog will get: invalid byte sequence for encoding "UTF8": 0xc3 0x22 The reason is that the error message in the bit_in / varbit_in function is output directly using %c. Causes the log file to not be decoded correctly. The attachment is a patch. -
Re: bugfix: invalid bit/varbit input causes the log file to be unreadable
Tom Lane <tgl@sss.pgh.pa.us> — 2020-06-26T16:45:43Z
Quan Zongliang <quanzongliang@gmail.com> writes: > The reason is that the error message in the bit_in / varbit_in function > is output directly using %c. Causes the log file to not be decoded > correctly. > The attachment is a patch. I'm really quite skeptical of the premise here. We do not guarantee that the postmaster log file is valid in any particular encoding; it'd be nearly impossible to do so if the cluster contains databases using different encodings. So I think you'd be way better off to reformulate your log-reading code to be less fragile. Even granting the premise, the proposed patch seems like a significant decrease in user-friendliness for typical cases. I'd rather see us make an effort to print one valid-per-the-DB-encoding character. Now that we can rely on snprintf to count %s restrictions in bytes, I think something like this should work: errmsg("\"%.*s\" is not a valid binary digit", pg_mblen(sp), sp))); But the real problem is that this is only the tip of the iceberg. You didn't even hit all the %c usages in varbit.c. A quick grep finds these other spots that can doubtless be made to do the same thing: acl.c:899: elog(ERROR, "unrecognized objtype abbreviation: %c", objtypec); arrayfuncs.c:507: errdetail("Unexpected \"%c\" character.", arrayfuncs.c:554: errdetail("Unexpected \"%c\" character.", arrayfuncs.c:584: errdetail("Unexpected \"%c\" character.", arrayfuncs.c:591: errdetail("Unmatched \"%c\" character.", '}'))); arrayfuncs.c:633: errdetail("Unexpected \"%c\" character.", encode.c:184: errmsg("invalid hexadecimal digit: \"%c\"", c))); encode.c:341: errmsg("invalid symbol \"%c\" while decoding base64 sequence", (int) c))); formatting.c:3298: errmsg("unmatched format separator \"%c\"", jsonpath_gram.c:2390: errdetail("unrecognized flag character \"%c\" in LIKE_REGEX predicate", regexp.c:426: errmsg("invalid regular expression option: \"%c\"", tsvector_op.c:312: elog(ERROR, "unrecognized weight: %c", char_weight); tsvector_op.c:872: errmsg("unrecognized weight: \"%c\"", char_weight))); varbit.c:233: errmsg("\"%c\" is not a valid binary digit", varbit.c:258: errmsg("\"%c\" is not a valid hexadecimal digit", varbit.c:534: errmsg("\"%c\" is not a valid binary digit", varbit.c:559: errmsg("\"%c\" is not a valid hexadecimal digit", varlena.c:5589: errmsg("unrecognized format() type specifier \"%c\"", varlena.c:5710: errmsg("unrecognized format() type specifier \"%c\"", and that's just in src/backend/utils/adt/. regards, tom lane -
Re: bugfix: invalid bit/varbit input causes the log file to be unreadable
Tom Lane <tgl@sss.pgh.pa.us> — 2020-06-28T17:10:59Z
I wrote: > Even granting the premise, the proposed patch seems like a significant > decrease in user-friendliness for typical cases. I'd rather see us > make an effort to print one valid-per-the-DB-encoding character. > Now that we can rely on snprintf to count %s restrictions in bytes, > I think something like this should work: > errmsg("\"%.*s\" is not a valid binary digit", > pg_mblen(sp), sp))); > But the real problem is that this is only the tip of the iceberg. > You didn't even hit all the %c usages in varbit.c. I went through all the %c format sequences in the backend to see which ones could use this type of fix. There were not as many as I'd expected, but still a fair number. (I skipped cases where the input was coming from the catalogs, as well as some non-user-facing debug printouts.) That leads to the attached patch, which seems to do the job without breaking anything that works today. regards, tom lane PS: I failed to resist the temptation to improve some shoddy error messages nearby in pageinspect/heapfuncs.c. -
Re: bugfix: invalid bit/varbit input causes the log file to be unreadable
Quan Zongliang <quanzongliang@gmail.com> — 2020-06-29T10:45:47Z
Good. I tested it, and it looks fine. Thank you. On 2020/6/29 1:10 上午, Tom Lane wrote: > I wrote: >> Even granting the premise, the proposed patch seems like a significant >> decrease in user-friendliness for typical cases. I'd rather see us >> make an effort to print one valid-per-the-DB-encoding character. >> Now that we can rely on snprintf to count %s restrictions in bytes, >> I think something like this should work: >> errmsg("\"%.*s\" is not a valid binary digit", >> pg_mblen(sp), sp))); >> But the real problem is that this is only the tip of the iceberg. >> You didn't even hit all the %c usages in varbit.c. > I went through all the %c format sequences in the backend to see which > ones could use this type of fix. There were not as many as I'd expected, > but still a fair number. (I skipped cases where the input was coming from > the catalogs, as well as some non-user-facing debug printouts.) That > leads to the attached patch, which seems to do the job without breaking > anything that works today. > > regards, tom lane > > PS: I failed to resist the temptation to improve some shoddy error > messages nearby in pageinspect/heapfuncs.c. > -
Re: bugfix: invalid bit/varbit input causes the log file to be unreadable
Tom Lane <tgl@sss.pgh.pa.us> — 2020-06-29T15:42:23Z
Quan Zongliang <quanzongliang@gmail.com> writes: > I tested it, and it looks fine. Pushed, thanks for reporting the issue! regards, tom lane
-
Re: bugfix: invalid bit/varbit input causes the log file to be unreadable
Huansong Fu <huansong.fu.info@gmail.com> — 2021-12-13T19:42:11Z
Hi, We recently saw a similar issue in v12 and wondered why the corresponding fix for v14 (https://github.com/postgres/postgres/commit/16e3ad5d143) was not backported to v13 and before. The commit message did mention that this fix might have problem with translatable string messages - would you mind providing a bit more context about what is needed to backport this fix? Thank you. Regards, Huansong https://vmware.com/ <https://vmware.com/> > On Jun 29, 2020, at 11:42 AM, Tom Lane <tgl@sss.pgh.pa.us> wrote: > > Quan Zongliang <quanzongliang@gmail.com> writes: >> I tested it, and it looks fine. > > Pushed, thanks for reporting the issue! > > regards, tom lane > > > >
-
Re: bugfix: invalid bit/varbit input causes the log file to be unreadable
Tom Lane <tgl@sss.pgh.pa.us> — 2021-12-13T20:33:30Z
Huansong Fu <huansong.fu.info@gmail.com> writes: > We recently saw a similar issue in v12 and wondered why the corresponding fix for v14 (https://github.com/postgres/postgres/commit/16e3ad5d143) was not backported to v13 and before. The commit message did mention that this fix might have problem with translatable string messages - would you mind providing a bit more context about what is needed to backport this fix? Thank you. Well, the commit message lists the reasons for not back-patching: * we've seen few field complaints about such problems * it'd add work for translators * it wouldn't work reliably before v12. Perhaps there's a case for back-patching as far as v12, but I can't get very excited about it. regards, tom lane