diff options
| author | Neil Conway | 2005-05-26 02:10:03 +0000 |
|---|---|---|
| committer | Neil Conway | 2005-05-26 02:10:03 +0000 |
| commit | 92525dd6c944a4c1233f2eaa6eed8e8d2b89669e (patch) | |
| tree | b2d9105c530ac76cabc9ba08adc39de30e0ae69a /src/include | |
| parent | 9a1a9865803b5fec8df9dcf74a8ad97c7db5384d (diff) | |
Adjust datetime parsing to be more robust. We now pass the length of the
working buffer into ParseDateTime() and reject too-long input there,
rather than checking the length of the input string before calling
ParseDateTime(). The old method was bogus because ParseDateTime() can use
a variable amount of working space, depending on the content of the
input string (e.g. how many fields need to be NUL terminated). This fixes
a minor stack overrun -- I don't _think_ it's exploitable, although I
won't claim to be an expert.
Along the way, fix a bug reported by Mark Dilger: the working buffer
allocated by interval_in() was too short, which resulted in rejecting
some perfectly valid interval input values. I added a regression test for
this fix.
Diffstat (limited to 'src/include')
| -rw-r--r-- | src/include/utils/datetime.h | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/src/include/utils/datetime.h b/src/include/utils/datetime.h index 0c2da14a041..1e25e205cfc 100644 --- a/src/include/utils/datetime.h +++ b/src/include/utils/datetime.h @@ -9,7 +9,7 @@ * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/utils/datetime.h,v 1.52 2004/12/31 22:03:45 pgsql Exp $ + * $PostgreSQL: pgsql/src/include/utils/datetime.h,v 1.52.4.1 2005/05/26 02:10:03 neilc Exp $ * *------------------------------------------------------------------------- */ @@ -276,7 +276,7 @@ extern void GetCurrentTimeUsec(struct pg_tm * tm, fsec_t *fsec, int *tzp); extern void j2date(int jd, int *year, int *month, int *day); extern int date2j(int year, int month, int day); -extern int ParseDateTime(const char *timestr, char *lowstr, +extern int ParseDateTime(const char *timestr, char *workbuf, size_t buflen, char **field, int *ftype, int maxfields, int *numfields); extern int DecodeDateTime(char **field, int *ftype, |
