diff options
Diffstat (limited to 'src/backend/utils/error/elog.c')
-rw-r--r-- | src/backend/utils/error/elog.c | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c index 3faef16851e..1c1203ec569 100644 --- a/src/backend/utils/error/elog.c +++ b/src/backend/utils/error/elog.c @@ -42,7 +42,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/error/elog.c,v 1.155.4.7 2007/07/21 22:12:24 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/utils/error/elog.c,v 1.155.4.8 2008/07/08 22:18:09 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -1170,6 +1170,7 @@ write_syslog(int level, const char *line) static unsigned long seq = 0; int len; + const char *nlpos; if (!openlog_done) { @@ -1222,10 +1223,11 @@ write_syslog(int level, const char *line) * smaller pieces. * * We divide into multiple syslog() calls if message is too long - * or if the message contains embedded NewLine(s) '\n'. + * or if the message contains embedded newline(s). */ len = strlen(line); - if (len > PG_SYSLOG_LIMIT || strchr(line, '\n') != NULL) + nlpos = strchr(line, '\n'); + if (len > PG_SYSLOG_LIMIT || nlpos != NULL) { int chunk_nr = 0; @@ -1240,15 +1242,19 @@ write_syslog(int level, const char *line) { line++; len--; + /* we need to recompute the next newline's position, too */ + nlpos = strchr(line, '\n'); continue; } - strncpy(buf, line, PG_SYSLOG_LIMIT); - buf[PG_SYSLOG_LIMIT] = '\0'; - if (strchr(buf, '\n') != NULL) - *strchr(buf, '\n') = '\0'; - - buflen = strlen(buf); + /* copy one line, or as much as will fit, to buf */ + if (nlpos != NULL) + buflen = nlpos - line; + else + buflen = len; + buflen = Min(buflen, PG_SYSLOG_LIMIT); + memcpy(buf, line, buflen); + buf[buflen] = '\0'; /* trim to multibyte letter boundary */ buflen = pg_mbcliplen(buf, buflen, buflen); |