]> granicus.if.org Git - postgresql/commitdiff
Avoid unportable usage of sscanf(UINT64_FORMAT).
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 27 May 2014 02:23:42 +0000 (22:23 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 27 May 2014 02:23:42 +0000 (22:23 -0400)
On Mingw, it seems that scanf() doesn't necessarily accept the same format
codes that printf() does, and in particular it may fail to recognize %llu
even though printf() does.  Since configure only probes printf() behavior
while setting up the INT64_FORMAT macros, this means it's unsafe to use
those macros with scanf().  We had only one instance of such a coding
pattern, in contrib/pg_stat_statements, so change that code to avoid
the problem.

Per buildfarm warnings.  Back-patch to 9.0 where the troublesome code
was introduced.

Michael Paquier

contrib/pg_stat_statements/pg_stat_statements.c

index ba565776d7e5422fa8ab73a96391e6f51ec5e623..ba56c16e1d3c3f0c6de5f00bcc71bc2fc96cb0da 100644 (file)
@@ -603,7 +603,7 @@ pgss_ProcessUtility(Node *parsetree, const char *queryString,
        {
                instr_time      start;
                instr_time      duration;
-               uint64          rows = 0;
+               uint64          rows;
                BufferUsage bufusage;
 
                bufusage = pgBufferUsage;
@@ -632,7 +632,15 @@ pgss_ProcessUtility(Node *parsetree, const char *queryString,
 
                /* parse command tag to retrieve the number of affected rows. */
                if (completionTag &&
-                       sscanf(completionTag, "COPY " UINT64_FORMAT, &rows) != 1)
+                       strncmp(completionTag, "COPY ", 5) == 0)
+               {
+#ifdef HAVE_STRTOULL
+                       rows = strtoull(completionTag + 5, NULL, 10);
+#else
+                       rows = strtoul(completionTag + 5, NULL, 10);
+#endif
+               }
+               else
                        rows = 0;
 
                /* calc differences of buffer counters. */