aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2014-10-06 21:23:20 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2014-10-06 21:23:45 -0400
commit037b912ecc87b4e6cdd933e23fc8ba5d3e45ec02 (patch)
tree43d9a54e7ed0c5396222b683ca974874a2a2a436
parent525510aea55e7c1259de6853555534559110ca50 (diff)
downloadpostgresql-037b912ecc87b4e6cdd933e23fc8ba5d3e45ec02.tar.gz
postgresql-037b912ecc87b4e6cdd933e23fc8ba5d3e45ec02.zip
Fix array overrun in ecpg's version of ParseDateTime().
The code wrote a value into the caller's field[] array before checking to see if there was room, which of course is backwards. Per report from Michael Paquier. I fixed the equivalent bug in the backend's version of this code way back in 630684d3a130bb93, but failed to think about ecpg's copy. Fortunately this doesn't look like it would be exploitable for anything worse than a core dump: an external attacker would have no control over the single word that gets written.
-rw-r--r--src/interfaces/ecpg/pgtypeslib/dt_common.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/src/interfaces/ecpg/pgtypeslib/dt_common.c b/src/interfaces/ecpg/pgtypeslib/dt_common.c
index be7e9963143..123561c4824 100644
--- a/src/interfaces/ecpg/pgtypeslib/dt_common.c
+++ b/src/interfaces/ecpg/pgtypeslib/dt_common.c
@@ -1675,6 +1675,7 @@ DecodePosixTimezone(char *str, int *tzp)
*
* The "lowstr" work buffer must have at least strlen(timestr) + MAXDATEFIELDS
* bytes of space. On output, field[] entries will point into it.
+ * The field[] and ftype[] arrays must have at least MAXDATEFIELDS entries.
*/
int
ParseDateTime(char *timestr, char *lowstr,
@@ -1688,9 +1689,9 @@ ParseDateTime(char *timestr, char *lowstr,
while (*(*endstr) != '\0')
{
/* Record start of current field */
- field[nf] = lp;
if (nf >= MAXDATEFIELDS)
return -1;
+ field[nf] = lp;
/* leading digit? then date or time */
if (isdigit((unsigned char) *(*endstr)))