diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index d21ca068b0b92d2ae84e87767c576aeb5e82dfdf..0d4fd56a2242c5de73199cf86de86a18604ed85b 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.203 2008/03/24 18:08:47 tgl Exp $
+ *	  $PostgreSQL: pgsql/src/backend/utils/error/elog.c,v 1.204 2008/07/08 22:17:41 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -1306,6 +1306,7 @@ write_syslog(int level, const char *line)
 	static unsigned long seq = 0;
 
 	int			len;
+	const char *nlpos;
 
 	/* Open syslog connection if not done yet */
 	if (!openlog_done)
@@ -1328,17 +1329,17 @@ write_syslog(int level, const char *line)
 	 * fact, it does work around by splitting up messages into smaller pieces.
 	 *
 	 * We divide into multiple syslog() calls if message is too long or if the
-	 * message contains embedded NewLine(s) '\n'.
+	 * 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;
 
 		while (len > 0)
 		{
 			char		buf[PG_SYSLOG_LIMIT + 1];
-			const char *nlpos;
 			int			buflen;
 			int			i;
 
@@ -1347,11 +1348,12 @@ write_syslog(int level, const char *line)
 			{
 				line++;
 				len--;
+				/* we need to recompute the next newline's position, too */
+				nlpos = strchr(line, '\n');
 				continue;
 			}
 
 			/* copy one line, or as much as will fit, to buf */
-			nlpos = strchr(line, '\n');
 			if (nlpos != NULL)
 				buflen = nlpos - line;
 			else