Hi,

The attachment is the proposal patch for dt_common.c.

replace strtol to strtoint, as strtol() will return 64-bit output in 
that case, while type of var, hr, tm_min
  is int.

Young

From fa744e6b2b2601a91080a016f480d443cd1dbf2d Mon Sep 17 00:00:00 2001
From: Young_X <yang...@hotmail.com>
Date: Tue, 9 Oct 2018 11:27:51 +0800
Subject: [PATCH]     [ECPG] fix functions in dt_common to correctly detect
 integer overflow when     running on a 64-bit platform ... strtol() will
 happily return 64-bit     output in that case, while type of var, hr, tm_min
 is int.

Signed-off-by: Young_X <yang...@hotmail.com>
---
 src/interfaces/ecpg/pgtypeslib/dt_common.c | 25 +++++++++++++------------
 1 file changed, 13 insertions(+), 12 deletions(-)

diff --git a/src/interfaces/ecpg/pgtypeslib/dt_common.c 
b/src/interfaces/ecpg/pgtypeslib/dt_common.c
index 568b172..75e6e6b 100644
--- a/src/interfaces/ecpg/pgtypeslib/dt_common.c
+++ b/src/interfaces/ecpg/pgtypeslib/dt_common.c
@@ -6,6 +6,7 @@
 #include <ctype.h>
 #include <math.h>
 
+#include "common/string.h"
 #include "extern.h"
 #include "dt.h"
 #include "pgtypes_timestamp.h"
@@ -1115,7 +1116,7 @@ DecodeNumberField(int len, char *str, int fmask,
                for (i = 0; i < 6; i++)
                        fstr[i] = *cp != '\0' ? *cp++ : '0';
                fstr[i] = '\0';
-               *fsec = strtol(fstr, NULL, 10);
+               *fsec = strtoint(fstr, NULL, 10);
                *cp = '\0';
                len = strlen(str);
        }
@@ -1206,7 +1207,7 @@ DecodeNumber(int flen, char *str, int fmask,
 
        *tmask = 0;
 
-       val = strtol(str, &cp, 10);
+       val = strtoint(str, &cp, 10);
        if (cp == str)
                return -1;
 
@@ -1442,11 +1443,11 @@ DecodeTime(char *str, int *tmask, struct tm *tm, fsec_t 
*fsec)
 
        *tmask = DTK_TIME_M;
 
-       tm->tm_hour = strtol(str, &cp, 10);
+       tm->tm_hour = strtoint(str, &cp, 10);
        if (*cp != ':')
                return -1;
        str = cp + 1;
-       tm->tm_min = strtol(str, &cp, 10);
+       tm->tm_min = strtoint(str, &cp, 10);
        if (*cp == '\0')
        {
                tm->tm_sec = 0;
@@ -1457,7 +1458,7 @@ DecodeTime(char *str, int *tmask, struct tm *tm, fsec_t 
*fsec)
        else
        {
                str = cp + 1;
-               tm->tm_sec = strtol(str, &cp, 10);
+               tm->tm_sec = strtoint(str, &cp, 10);
                if (*cp == '\0')
                        *fsec = 0;
                else if (*cp == '.')
@@ -1478,7 +1479,7 @@ DecodeTime(char *str, int *tmask, struct tm *tm, fsec_t 
*fsec)
                        for (i = 0; i < 6; i++)
                                fstr[i] = *cp != '\0' ? *cp++ : '0';
                        fstr[i] = '\0';
-                       *fsec = strtol(fstr, &cp, 10);
+                       *fsec = strtoint(fstr, &cp, 10);
                        if (*cp != '\0')
                                return -1;
                }
@@ -1510,20 +1511,20 @@ DecodeTimezone(char *str, int *tzp)
        int                     len;
 
        /* assume leading character is "+" or "-" */
-       hr = strtol(str + 1, &cp, 10);
+       hr = strtoint(str + 1, &cp, 10);
 
        /* explicit delimiter? */
        if (*cp == ':')
-               min = strtol(cp + 1, &cp, 10);
+               min = strtoint(cp + 1, &cp, 10);
        /* otherwise, might have run things together... */
        else if (*cp == '\0' && (len = strlen(str)) > 3)
        {
-               min = strtol(str + len - 2, &cp, 10);
+               min = strtoint(str + len - 2, &cp, 10);
                if (min < 0 || min >= 60)
                        return -1;
 
                *(str + len - 2) = '\0';
-               hr = strtol(str + 1, &cp, 10);
+               hr = strtoint(str + 1, &cp, 10);
                if (hr < 0 || hr > 13)
                        return -1;
        }
@@ -1830,7 +1831,7 @@ DecodeDateTime(char **field, int *ftype, int nf,
                                        if (tzp == NULL)
                                                return -1;
 
-                                       val = strtol(field[i], &cp, 10);
+                                       val = strtoint(field[i], &cp, 10);
                                        if (*cp != '-')
                                                return -1;
 
@@ -1965,7 +1966,7 @@ DecodeDateTime(char **field, int *ftype, int nf,
                                        char       *cp;
                                        int                     val;
 
-                                       val = strtol(field[i], &cp, 10);
+                                       val = strtoint(field[i], &cp, 10);
 
                                        /*
                                         * only a few kinds are allowed to have 
an embedded
-- 
2.7.4

Reply via email to