Fix unsafe assumption that struct timeval.tv_sec is a "long".
authorTom Lane <tgl@sss.pgh.pa.us>
Wed, 7 Dec 2016 00:52:34 +0000 (19:52 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Wed, 7 Dec 2016 00:52:34 +0000 (19:52 -0500)
It typically is a "long", but it seems possible that on some platforms
it wouldn't be.  In any case, this silences a compiler warning on
OpenBSD (cf buildfarm member curculio).

While at it, use snprintf not sprintf.  This format string couldn't
possibly overrun the supplied buffer, but that doesn't seem like
a good reason not to use the safer style.

Oversight in commit f828654e1.  Back-patch to 9.6 where that came in.

src/backend/utils/error/elog.c

index 224ee7801c1b39a6d6472d179ab29c444e3dad3d..69649290da24557e0d72a5ae46558f68f2777db2 100644 (file)
@@ -2484,8 +2484,9 @@ log_line_prefix(StringInfo buf, ErrorData *edata)
                                                saved_timeval_set = true;
                                        }
 
-                                       sprintf(strfbuf, "%ld.%03d", saved_timeval.tv_sec,
-                                                       (int) (saved_timeval.tv_usec / 1000));
+                                       snprintf(strfbuf, sizeof(strfbuf), "%ld.%03d",
+                                                        (long) saved_timeval.tv_sec,
+                                                        (int) (saved_timeval.tv_usec / 1000));
 
                                        if (padding != 0)
                                                appendStringInfo(buf, "%*s", padding, strfbuf);