pgpool2.git / summary / log / commit / refs

commit    475091c9e3af860ad1338fa63f1b479aaa98a336
Author:   Tatsuo Ishii <ishii at sraoss.co.jp>
Date:     Thu Aug 06 07:46:42 2009 +0000

    Fix buffer overrun error which mangled kind mismatch error message
    in pool_send_error_message().
    Bug rpeort by Takahiro Itagaki at [pgsql-jp: 39950].
    Fix suggested by Akio Ishida at [pgsql-jp: 39952].


pool_process_query.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/pool_process_query.c b/pool_process_query.c index 80e140521..fb77786c0 100644 --- a/pool_process_query.c +++ b/pool_process_query.c @@ -2383,8 +2383,16 @@ void pool_send_error_message(POOL_CONNECTION *frontend, int protoMajor, char *file, int line) { -#define MAXDATA 1024 -#define MAXMSGBUF 128 +/* + * Buffer length for each message part + */ +#define MAXMSGBUF 256 +/* + * Buffer length for result message buffer. + * Since msg is consisted of 7 parts, msg buffer should be large + * enough to hold those message parts +*/ +#define MAXDATA (MAXMSGBUF+1)*7+1 pool_set_nonblock(frontend->fd); @@ -2407,16 +2415,19 @@ void pool_send_error_message(POOL_CONNECTION *frontend, int protoMajor, /* error level */ thislen = snprintf(msgbuf, MAXMSGBUF, "SERROR"); + thislen = Min(thislen, MAXMSGBUF); memcpy(data +len, msgbuf, thislen+1); len += thislen + 1; /* code */ thislen = snprintf(msgbuf, MAXMSGBUF, "C%s", code); + thislen = Min(thislen, MAXMSGBUF); memcpy(data +len, msgbuf, thislen+1); len += thislen + 1; /* message */ thislen = snprintf(msgbuf, MAXMSGBUF, "M%s", message); + thislen = Min(thislen, MAXMSGBUF); memcpy(data +len, msgbuf, thislen+1); len += thislen + 1; @@ -2424,6 +2435,7 @@ void pool_send_error_message(POOL_CONNECTION *frontend, int protoMajor, if (*detail != '\0') { thislen = snprintf(msgbuf, MAXMSGBUF, "D%s", detail); + thislen = Min(thislen, MAXMSGBUF); memcpy(data +len, msgbuf, thislen+1); len += thislen + 1; } @@ -2432,17 +2444,20 @@ void pool_send_error_message(POOL_CONNECTION *frontend, int protoMajor, if (*hint != '\0') { thislen = snprintf(msgbuf, MAXMSGBUF, "H%s", hint); + thislen = Min(thislen, MAXMSGBUF); memcpy(data +len, msgbuf, thislen+1); len += thislen + 1; } /* file */ thislen = snprintf(msgbuf, MAXMSGBUF, "F%s", file); + thislen = Min(thislen, MAXMSGBUF); memcpy(data +len, msgbuf, thislen+1); len += thislen + 1; /* line */ thislen = snprintf(msgbuf, MAXMSGBUF, "L%d", line); + thislen = Min(thislen, MAXMSGBUF); memcpy(data +len, msgbuf, thislen+1); len += thislen + 1; [parent: f8281f175036]