git.postgresql.org Git - postgresql.git/commitdiff

git projects / postgresql.git / commitdiff
? search:
summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 08ffa78)
Added result checks for calls to gmtime().
Wed, 4 Feb 2009 08:51:10 +0000 (08:51 +0000)
Wed, 4 Feb 2009 08:51:10 +0000 (08:51 +0000)

diff --git a/src/interfaces/ecpg/pgtypeslib/datetime.c b/src/interfaces/ecpg/pgtypeslib/datetime.c
index 3910859d348e30fe8aaf90ffeeb31ce9a8427fc7..9dc900e9b25729f4caad3acbefdbf612132b1b8c 100644 (file)
--- a/src/interfaces/ecpg/pgtypeslib/datetime.c
+++ b/src/interfaces/ecpg/pgtypeslib/datetime.c
@@ -1,4 +1,4 @@
-/* $PostgreSQL: pgsql/src/interfaces/ecpg/pgtypeslib/datetime.c,v 1.34 2007年11月15日 21:14:45 momjian Exp $ */
+/* $PostgreSQL: pgsql/src/interfaces/ecpg/pgtypeslib/datetime.c,v 1.35 2009年02月04日 08:51:09 meskes Exp $ */
#include "postgres_fe.h"
@@ -87,7 +87,11 @@ PGTYPESdate_from_asc(char *str, char **endptr)
break;
case DTK_EPOCH:
- GetEpochTime(tm);
+ if (GetEpochTime(tm) < 0)
+ {
+ errno = PGTYPES_DATE_BAD_DATE;
+ return INT_MIN;
+ }
break;
default:
@@ -153,7 +157,8 @@ PGTYPESdate_today(date * d)
struct tm ts;
GetCurrentDateTime(&ts);
- *d = date2j(ts.tm_year, ts.tm_mon, ts.tm_mday) - date2j(2000, 1, 1);
+ if (errno == 0)
+ *d = date2j(ts.tm_year, ts.tm_mon, ts.tm_mday) - date2j(2000, 1, 1);
return;
}
diff --git a/src/interfaces/ecpg/pgtypeslib/dt.h b/src/interfaces/ecpg/pgtypeslib/dt.h
index 0008211fad0049568c33abddf4fb1bafe20f3350..ac0b1369029b15acc40281c750efdc3bfdfaf9b3 100644 (file)
--- a/src/interfaces/ecpg/pgtypeslib/dt.h
+++ b/src/interfaces/ecpg/pgtypeslib/dt.h
@@ -1,4 +1,4 @@
-/* $PostgreSQL: pgsql/src/interfaces/ecpg/pgtypeslib/dt.h,v 1.40 2008年11月26日 16:31:02 meskes Exp $ */
+/* $PostgreSQL: pgsql/src/interfaces/ecpg/pgtypeslib/dt.h,v 1.41 2009年02月04日 08:51:09 meskes Exp $ */
#ifndef DT_H
#define DT_H
@@ -342,7 +342,7 @@ int tm2timestamp(struct tm *, fsec_t, int *, timestamp *);
int DecodeUnits(int field, char *lowtoken, int *val);
bool CheckDateTokenTables(void);
int EncodeDateOnly(struct tm *, int, char *, bool);
-void GetEpochTime(struct tm *);
+int GetEpochTime(struct tm *);
int ParseDateTime(char *, char *, char **, int *, int, int *, char **);
int DecodeDateTime(char **, int *, int, int *, struct tm *, fsec_t *, bool);
void j2date(int, int *, int *, int *);
diff --git a/src/interfaces/ecpg/pgtypeslib/dt_common.c b/src/interfaces/ecpg/pgtypeslib/dt_common.c
index d3e5396dc4129e634eb5bcbc940d519077d4027c..dc3ef05826f22541588e09f68c73e530953ef655 100644 (file)
--- a/src/interfaces/ecpg/pgtypeslib/dt_common.c
+++ b/src/interfaces/ecpg/pgtypeslib/dt_common.c
@@ -1,4 +1,4 @@
-/* $PostgreSQL: pgsql/src/interfaces/ecpg/pgtypeslib/dt_common.c,v 1.45 2009年02月02日 15:35:28 meskes Exp $ */
+/* $PostgreSQL: pgsql/src/interfaces/ecpg/pgtypeslib/dt_common.c,v 1.46 2009年02月04日 08:51:09 meskes Exp $ */
#include "postgres_fe.h"
@@ -982,7 +982,7 @@ EncodeDateTime(struct tm * tm, fsec_t fsec, int *tzp, char **tzn, int style, cha
return TRUE;
} /* EncodeDateTime() */
-void
+int
GetEpochTime(struct tm * tm)
{
struct tm *t0;
@@ -990,14 +990,19 @@ GetEpochTime(struct tm * tm)
t0 = gmtime(&epoch);
- tm->tm_year = t0->tm_year + 1900;
- tm->tm_mon = t0->tm_mon + 1;
- tm->tm_mday = t0->tm_mday;
- tm->tm_hour = t0->tm_hour;
- tm->tm_min = t0->tm_min;
- tm->tm_sec = t0->tm_sec;
+ if (t0)
+ {
+ tm->tm_year = t0->tm_year + 1900;
+ tm->tm_mon = t0->tm_mon + 1;
+ tm->tm_mday = t0->tm_mday;
+ tm->tm_hour = t0->tm_hour;
+ tm->tm_min = t0->tm_min;
+ tm->tm_sec = t0->tm_sec;
+
+ return 0;
+ }
- return;
+ return -1;
} /* GetEpochTime() */
static void
@@ -1006,11 +1011,18 @@ abstime2tm(AbsoluteTime _time, int *tzp, struct tm * tm, char **tzn)
time_t time = (time_t) _time;
struct tm *tx;
+ errno = 0;
if (tzp != NULL)
tx = localtime((time_t *) &time);
else
tx = gmtime((time_t *) &time);
+ if (!tx)
+ {
+ errno = PGTYPES_TS_BAD_TIMESTAMP;
+ return;
+ }
+
tm->tm_year = tx->tm_year + 1900;
tm->tm_mon = tx->tm_mon + 1;
tm->tm_mday = tx->tm_mday;
@@ -2852,12 +2864,18 @@ PGTYPEStimestamp_defmt_scan(char **str, char *fmt, timestamp * d,
time_t et = (time_t) scan_val.luint_val;
tms = gmtime(&et);
- *year = tms->tm_year + 1900;
- *month = tms->tm_mon + 1;
- *day = tms->tm_mday;
- *hour = tms->tm_hour;
- *minute = tms->tm_min;
- *second = tms->tm_sec;
+
+ if (tms)
+ {
+ *year = tms->tm_year + 1900;
+ *month = tms->tm_mon + 1;
+ *day = tms->tm_mday;
+ *hour = tms->tm_hour;
+ *minute = tms->tm_min;
+ *second = tms->tm_sec;
+ }
+ else
+ err = 1;
}
break;
case 'S':
diff --git a/src/interfaces/ecpg/pgtypeslib/timestamp.c b/src/interfaces/ecpg/pgtypeslib/timestamp.c
index 74995b5ca2a7babec1843fdf02a55487c26a8f1c..e4ff8b664eccc7551aa576fa8f8d9c3c095b9e62 100644 (file)
--- a/src/interfaces/ecpg/pgtypeslib/timestamp.c
+++ b/src/interfaces/ecpg/pgtypeslib/timestamp.c
@@ -1,5 +1,5 @@
/*
- * $PostgreSQL: pgsql/src/interfaces/ecpg/pgtypeslib/timestamp.c,v 1.42 2008年05月17日 01:28:25 adunstan Exp $
+ * $PostgreSQL: pgsql/src/interfaces/ecpg/pgtypeslib/timestamp.c,v 1.43 2009年02月04日 08:51:10 meskes Exp $
*/
#include "postgres_fe.h"
@@ -91,11 +91,18 @@ tm2timestamp(struct tm * tm, fsec_t fsec, int *tzp, timestamp * result)
static timestamp
SetEpochTimestamp(void)
{
+#ifdef HAVE_INT64_TIMESTAMP
+ int64 noresult = 0;
+#else
+ double noresult = 0.0;
+#endif
timestamp dt;
struct tm tt,
*tm = &tt;
- GetEpochTime(tm);
+ if (GetEpochTime(tm) < 0)
+ return noresult;
+
tm2timestamp(tm, 0, NULL, &dt);
return dt;
} /* SetEpochTimestamp() */
@@ -372,7 +379,8 @@ PGTYPEStimestamp_current(timestamp * ts)
struct tm tm;
GetCurrentDateTime(&tm);
- tm2timestamp(&tm, 0, NULL, ts);
+ if (errno == 0)
+ tm2timestamp(&tm, 0, NULL, ts);
return;
}
This is the main PostgreSQL git repository.
RSS Atom

AltStyle によって変換されたページ (->オリジナル) /