]> granicus.if.org Git - postgresql/commitdiff
In pg_log_generic(), be more paranoid about preserving errno.
authorTom Lane <tgl@sss.pgh.pa.us>
Sat, 6 Jul 2019 15:25:37 +0000 (11:25 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Sat, 6 Jul 2019 15:25:37 +0000 (11:25 -0400)
This code failed to account for the possibility that malloc() would
change errno, resulting in wrong output for %m, not to mention the
possibility of message truncation.  Such a change is obviously
expected when malloc fails, but there's reason to fear that on some
platforms even a successful malloc call can modify errno.

Discussion: https://postgr.es/m/2576.1527382833@sss.pgh.pa.us

src/common/logging.c

index f247554a32b96a9a85df6a6777f3f3a95ceff68e..895da7150e7a1521f10c6c2887b58c28b52482ae 100644 (file)
@@ -216,6 +216,8 @@ pg_log_generic_v(enum pg_log_level level, const char *pg_restrict fmt, va_list a
 
        buf = pg_malloc_extended(required_len, MCXT_ALLOC_NO_OOM);
 
+       errno = save_errno;                     /* malloc might change errno */
+
        if (!buf)
        {
                /* memory trouble, just print what we can and get out of here */