Skip to content

Commit 649a125

Browse files
author
Michael Meskes
committed
Added result checks for calls to gmtime().
1 parent 08ffa78 commit 649a125

File tree

4 files changed

+54
-23
lines changed

4 files changed

+54
-23
lines changed

src/interfaces/ecpg/pgtypeslib/datetime.c

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* $PostgreSQL: pgsql/src/interfaces/ecpg/pgtypeslib/datetime.c,v 1.34 2007/11/15 21:14:45 momjian Exp $ */
1+
/* $PostgreSQL: pgsql/src/interfaces/ecpg/pgtypeslib/datetime.c,v 1.35 2009/02/04 08:51:09 meskes Exp $ */
22

33
#include "postgres_fe.h"
44

@@ -87,7 +87,11 @@ PGTYPESdate_from_asc(char *str, char **endptr)
8787
break;
8888

8989
case DTK_EPOCH:
90-
GetEpochTime(tm);
90+
if (GetEpochTime(tm) < 0)
91+
{
92+
errno = PGTYPES_DATE_BAD_DATE;
93+
return INT_MIN;
94+
}
9195
break;
9296

9397
default:
@@ -153,7 +157,8 @@ PGTYPESdate_today(date * d)
153157
struct tm ts;
154158

155159
GetCurrentDateTime(&ts);
156-
*d = date2j(ts.tm_year, ts.tm_mon, ts.tm_mday) - date2j(2000, 1, 1);
160+
if (errno == 0)
161+
*d = date2j(ts.tm_year, ts.tm_mon, ts.tm_mday) - date2j(2000, 1, 1);
157162
return;
158163
}
159164

src/interfaces/ecpg/pgtypeslib/dt.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* $PostgreSQL: pgsql/src/interfaces/ecpg/pgtypeslib/dt.h,v 1.40 2008/11/26 16:31:02 meskes Exp $ */
1+
/* $PostgreSQL: pgsql/src/interfaces/ecpg/pgtypeslib/dt.h,v 1.41 2009/02/04 08:51:09 meskes Exp $ */
22

33
#ifndef DT_H
44
#define DT_H
@@ -342,7 +342,7 @@ int tm2timestamp(struct tm *, fsec_t, int *, timestamp *);
342342
int DecodeUnits(int field, char *lowtoken, int *val);
343343
bool CheckDateTokenTables(void);
344344
int EncodeDateOnly(struct tm *, int, char *, bool);
345-
void GetEpochTime(struct tm *);
345+
int GetEpochTime(struct tm *);
346346
int ParseDateTime(char *, char *, char **, int *, int, int *, char **);
347347
int DecodeDateTime(char **, int *, int, int *, struct tm *, fsec_t *, bool);
348348
void j2date(int, int *, int *, int *);

src/interfaces/ecpg/pgtypeslib/dt_common.c

Lines changed: 33 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* $PostgreSQL: pgsql/src/interfaces/ecpg/pgtypeslib/dt_common.c,v 1.45 2009/02/02 15:35:28 meskes Exp $ */
1+
/* $PostgreSQL: pgsql/src/interfaces/ecpg/pgtypeslib/dt_common.c,v 1.46 2009/02/04 08:51:09 meskes Exp $ */
22

33
#include "postgres_fe.h"
44

@@ -982,22 +982,27 @@ EncodeDateTime(struct tm * tm, fsec_t fsec, int *tzp, char **tzn, int style, cha
982982
return TRUE;
983983
} /* EncodeDateTime() */
984984

985-
void
985+
int
986986
GetEpochTime(struct tm * tm)
987987
{
988988
struct tm *t0;
989989
time_t epoch = 0;
990990

991991
t0 = gmtime(&epoch);
992992

993-
tm->tm_year = t0->tm_year + 1900;
994-
tm->tm_mon = t0->tm_mon + 1;
995-
tm->tm_mday = t0->tm_mday;
996-
tm->tm_hour = t0->tm_hour;
997-
tm->tm_min = t0->tm_min;
998-
tm->tm_sec = t0->tm_sec;
993+
if (t0)
994+
{
995+
tm->tm_year = t0->tm_year + 1900;
996+
tm->tm_mon = t0->tm_mon + 1;
997+
tm->tm_mday = t0->tm_mday;
998+
tm->tm_hour = t0->tm_hour;
999+
tm->tm_min = t0->tm_min;
1000+
tm->tm_sec = t0->tm_sec;
1001+
1002+
return 0;
1003+
}
9991004

1000-
return;
1005+
return -1;
10011006
} /* GetEpochTime() */
10021007

10031008
static void
@@ -1006,11 +1011,18 @@ abstime2tm(AbsoluteTime _time, int *tzp, struct tm * tm, char **tzn)
10061011
time_t time = (time_t) _time;
10071012
struct tm *tx;
10081013

1014+
errno = 0;
10091015
if (tzp != NULL)
10101016
tx = localtime((time_t *) &time);
10111017
else
10121018
tx = gmtime((time_t *) &time);
10131019

1020+
if (!tx)
1021+
{
1022+
errno = PGTYPES_TS_BAD_TIMESTAMP;
1023+
return;
1024+
}
1025+
10141026
tm->tm_year = tx->tm_year + 1900;
10151027
tm->tm_mon = tx->tm_mon + 1;
10161028
tm->tm_mday = tx->tm_mday;
@@ -2852,12 +2864,18 @@ PGTYPEStimestamp_defmt_scan(char **str, char *fmt, timestamp * d,
28522864
time_t et = (time_t) scan_val.luint_val;
28532865

28542866
tms = gmtime(&et);
2855-
*year = tms->tm_year + 1900;
2856-
*month = tms->tm_mon + 1;
2857-
*day = tms->tm_mday;
2858-
*hour = tms->tm_hour;
2859-
*minute = tms->tm_min;
2860-
*second = tms->tm_sec;
2867+
2868+
if (tms)
2869+
{
2870+
*year = tms->tm_year + 1900;
2871+
*month = tms->tm_mon + 1;
2872+
*day = tms->tm_mday;
2873+
*hour = tms->tm_hour;
2874+
*minute = tms->tm_min;
2875+
*second = tms->tm_sec;
2876+
}
2877+
else
2878+
err = 1;
28612879
}
28622880
break;
28632881
case 'S':

src/interfaces/ecpg/pgtypeslib/timestamp.c

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* $PostgreSQL: pgsql/src/interfaces/ecpg/pgtypeslib/timestamp.c,v 1.42 2008/05/17 01:28:25 adunstan Exp $
2+
* $PostgreSQL: pgsql/src/interfaces/ecpg/pgtypeslib/timestamp.c,v 1.43 2009/02/04 08:51:10 meskes Exp $
33
*/
44
#include "postgres_fe.h"
55

@@ -91,11 +91,18 @@ tm2timestamp(struct tm * tm, fsec_t fsec, int *tzp, timestamp * result)
9191
static timestamp
9292
SetEpochTimestamp(void)
9393
{
94+
#ifdef HAVE_INT64_TIMESTAMP
95+
int64 noresult = 0;
96+
#else
97+
double noresult = 0.0;
98+
#endif
9499
timestamp dt;
95100
struct tm tt,
96101
*tm = &tt;
97102

98-
GetEpochTime(tm);
103+
if (GetEpochTime(tm) < 0)
104+
return noresult;
105+
99106
tm2timestamp(tm, 0, NULL, &dt);
100107
return dt;
101108
} /* SetEpochTimestamp() */
@@ -372,7 +379,8 @@ PGTYPEStimestamp_current(timestamp * ts)
372379
struct tm tm;
373380

374381
GetCurrentDateTime(&tm);
375-
tm2timestamp(&tm, 0, NULL, ts);
382+
if (errno == 0)
383+
tm2timestamp(&tm, 0, NULL, ts);
376384
return;
377385
}
378386

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy