diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 1ae16b22ae7642bd6d494b8d74b2f97c61677f2a..89ba2f8d203784bda909f8f77ed56112c42bc6c0 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2003-04-24  Neil Booth  <neil@daikokuya.co.uk>
+
+	* cpplex.c (cpp_token_len): Tighten up.
+	(cpp_token_as_text): Need extra byte now.
+	* cpplib.c (glue_header_name): Need extra 2 bytes.
+	* cppmacro.c (cpp_macro_definition): Need extra byte.
+
 2003-04-24  Alexander Kabaev <kan@FreeBSD.ORG>
 
 	* config/sparc/sparc.md (umulsidi3, mulsidi3): Avoid using
diff --git a/gcc/cpplex.c b/gcc/cpplex.c
index c9c064143c3533e5cfea2d90807c4ff0d49a69a4..4f0767e42c8eaa916340d2433ebb999fdba2018d 100644
--- a/gcc/cpplex.c
+++ b/gcc/cpplex.c
@@ -1094,8 +1094,8 @@ _cpp_lex_direct (pfile)
   return result;
 }
 
-/* An upper bound on the number of bytes needed to spell TOKEN,
-   including preceding whitespace.  */
+/* An upper bound on the number of bytes needed to spell TOKEN.
+   Does not include preceding whitespace.  */
 unsigned int
 cpp_token_len (token)
      const cpp_token *token;
@@ -1104,12 +1104,12 @@ cpp_token_len (token)
 
   switch (TOKEN_SPELL (token))
     {
-    default:		len = 0;				break;
+    default:		len = 4;				break;
     case SPELL_LITERAL:	len = token->val.str.len;		break;
     case SPELL_IDENT:	len = NODE_LEN (token->val.node);	break;
     }
-  /* 1 for whitespace, 4 for comment delimiters.  */
-  return len + 5;
+
+  return len;
 }
 
 /* Write the spelling of a token TOKEN to BUFFER.  The buffer must
@@ -1167,8 +1167,8 @@ unsigned char *
 cpp_token_as_text (pfile, token)
      cpp_reader *pfile;
      const cpp_token *token;
-{
-  unsigned int len = cpp_token_len (token);
+{ 
+  unsigned int len = cpp_token_len (token) + 1;
   unsigned char *start = _cpp_unaligned_alloc (pfile, len), *end;
 
   end = cpp_spell_token (pfile, token, start);
diff --git a/gcc/cpplib.c b/gcc/cpplib.c
index 9b95ac950cffd5cc07e85945ba7206b6d475609e..271aa5d487b6ac08825b800c435ac6095d68dc05 100644
--- a/gcc/cpplib.c
+++ b/gcc/cpplib.c
@@ -594,7 +594,7 @@ glue_header_name (pfile)
 	  break;
 	}
 
-      len = cpp_token_len (token);
+      len = cpp_token_len (token) + 2; /* Leading space, terminating \0.  */
       if (total_len + len > capacity)
 	{
 	  capacity = (capacity + len) * 2;
diff --git a/gcc/cppmacro.c b/gcc/cppmacro.c
index b0b10ae92d755f3e4d624a742b6c444016ab2bde..f77f6b36837430acfb303e60f3d49d09560262c1 100644
--- a/gcc/cppmacro.c
+++ b/gcc/cppmacro.c
@@ -1715,7 +1715,7 @@ cpp_macro_definition (pfile, node)
 	  if (token->type == CPP_MACRO_ARG)
 	    len += NODE_LEN (macro->params[token->val.arg_no - 1]);
 	  else
-	    len += cpp_token_len (token); /* Includes room for ' '.  */
+	    len += cpp_token_len (token) + 1; /* Includes room for ' '.  */
 	  if (token->flags & STRINGIFY_ARG)
 	    len++;			/* "#" */
 	  if (token->flags & PASTE_LEFT)