Fix compiler warning induced by commit d8b15eeb8.
authorTom Lane <tgl@sss.pgh.pa.us>
Wed, 24 Jun 2020 19:47:30 +0000 (15:47 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Wed, 24 Jun 2020 19:47:30 +0000 (15:47 -0400)
I forgot that INT64_FORMAT can't be used with sscanf on Windows.
Use the same trick of sscanf'ing into a temp variable as we do in
some other places in zic.c.

The upstream IANA code avoids the portability problem by relying on
<inttypes.h>'s SCNdFAST64 macro.  Once we're requiring C99 in all
branches, we should do likewise and drop this set of diffs from
upstream.  For now, though, a hack seems fine, since we do not
actually care about leapseconds anyway.

Discussion: https://postgr.es/m/4e5d1a5b-143e-e70e-a99d-a3b01c1ae7c3@2ndquadrant.com

src/timezone/zic.c

index e5a3ca26f42e0b9474261313db8e391f36e31fa9..10c5b4bfb5b55e517383ec2698527ac26f3e74b1 100644 (file)
@@ -1292,7 +1292,20 @@ infile(const char *name)
                if (nfields == 0)
                {
                        if (name == leapsec && *buf == '#')
-                               sscanf(buf, "#expires " INT64_FORMAT, &comment_leapexpires);
+                       {
+                               /*
+                                * PG: INT64_FORMAT isn't portable for sscanf, so be content
+                                * with scanning a "long".  Once we are requiring C99 in all
+                                * live branches, it'd be sensible to adopt upstream's
+                                * practice of using the <inttypes.h> macros.  But for now, we
+                                * don't actually use this code, and it won't overflow before
+                                * 2038 anyway.
+                                */
+                               long            cl_tmp;
+
+                               sscanf(buf, "#expires %ld", &cl_tmp);
+                               comment_leapexpires = cl_tmp;
+                       }
                }
                else if (wantcont)
                {