From 80ddb590b6729fb398cad00b0774f2d10e954b0d Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Mon, 6 Oct 2014 21:23:20 -0400 Subject: [PATCH] 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. --- src/interfaces/ecpg/pgtypeslib/dt_common.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/interfaces/ecpg/pgtypeslib/dt_common.c b/src/interfaces/ecpg/pgtypeslib/dt_common.c index 7ca4dd51ce..2286acd428 100644 --- a/src/interfaces/ecpg/pgtypeslib/dt_common.c +++ b/src/interfaces/ecpg/pgtypeslib/dt_common.c @@ -1682,6 +1682,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, @@ -1695,9 +1696,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))) -- 2.40.0