Re: Allowing printf("%m") only where it actually works
Tom Lane <tgl@sss.pgh.pa.us>
Attachments
- make-exec.c-do-error-reporting-like-everyplace-else.patch (text/x-diff) patch
I wrote:
> Thomas Munro <thomas.munro@enterprisedb.com> writes:
>> Here's an experimental way to do that, if you don't mind depending on
>> gory details of libc implementations (ie knowledge of what it expands
>> too). Not sure how to avoid that since it's a macro on all modern
>> systems, and we don't have a way to temporarily redefine a macro. If
>> you enable it for just ereport(), it compiles cleanly after 81256cd
>> (but fails on earlier commits). If you enable it for elog() too then
>> it finds problems with exec.c.
> Hmm ... that's pretty duff code in exec.c, isn't it. Aside from the
> question of errno unsafety, it's using elog where it really ought to be
> using ereport, it's not taking any thought for the reported SQLSTATE,
> etc. I'm hesitant to mess with it mere hours before the beta wrap,
> but we really oughta improve that.
I wrote up a patch that makes src/common/exec.c do error reporting more
like other frontend/backend-common files (attached). Now that I've done
so, though, I'm having second thoughts. The thing that I don't like
about this is that it doubles the number of translatable strings created
by this file. While there's not *that* many of them, translators have to
deal with each one several times because this file is included by several
different frontend programs. So that seems like a rather high price to
pay to deal with what, at present, is a purely hypothetical hazard.
(Basically what this would protect against is elog_start changing errno,
which it doesn't.) Improving the errcode situation is somewhat useful,
but still maybe it's not worth the cost.
Another approach we could consider is keeping exec.c's one-off approach
to error handling and letting it redefine pg_prevent_errno_in_scope() as
empty. But that's ugly.
Or we could make the affected call sites work like this:
int save_errno = errno;
log_error(_("could not identify current directory: %s"),
strerror(save_errno));
which on the whole might be the most expedient thing.
regards, tom lane
Commits
-
In pg_log_generic(), be more paranoid about preserving errno.
- cf665ad4c89e 12.0 landed
- fb30c9c1c5c3 13.0 landed
-
Make src/common/exec.c's error logging less ugly.
- b6b297d20df9 12.0 landed
-
Select appropriate PG_PRINTF_ATTRIBUTE for recent NetBSD.
- aed9fa0bd897 12.0 landed
-
Fix detection of the result type of strerror_r().
- e5baf8c27e6c 9.4.20 landed
- 8b36dc588d10 9.5.15 landed
- 7871a36255e2 11.0 landed
- 2855421ec728 9.6.11 landed
- 0aa1e0ef167d 10.6 landed
- 08aad3c81eff 9.3.25 landed
-
Try another way to detect the result type of strerror_r().
- 751f532b9766 12.0 landed
-
Clean up *printf macros to avoid conflict with format archetypes.
- 8b91d258844a 12.0 landed
-
Fix link failures due to snprintf/strerror changes.
- a6b88d682cbe 12.0 landed
-
Implement %m in src/port/snprintf.c, and teach elog.c to rely on that.
- d6c55de1f99a 12.0 landed
-
Always use our own versions of *printf().
- 96bf88d52711 12.0 landed
-
Incorporate strerror_r() into src/port/snprintf.c, too.
- 758ce9b77948 12.0 landed
-
Convert elog.c's useful_strerror() into a globally-used strerror wrapper.
- 26e9d4d4ef16 12.0 landed
-
Revert "Distinguish printf-like functions that support %m from those that don't."
- 46b5e7c4b5be 12.0 landed
-
Produce compiler errors if errno is referenced inside elog/ereport calls.
- a2a8acd15217 12.0 landed
-
Distinguish printf-like functions that support %m from those that don't.
- 3a60c8ff892a 12.0 landed
-
Fix unportable usage of printf("%m").
- a13b47a59ffc 11.0 cited
-
Be more robust when strerror() doesn't give a useful result.
- 8e68816cc256 9.4.0 cited