diff --git a/newlib/ChangeLog b/newlib/ChangeLog
index 22a7cd06f..53ce03675 100644
--- a/newlib/ChangeLog
+++ b/newlib/ChangeLog
@@ -1,3 +1,8 @@
+2008-10-02  Jeff Johnston  <jjohnstn@redhat.com>
+
+	* libc/string/str-two-way.h (critical_factorization): Cast the index
+	operation to ensure unsigned rollover occurs when adding to SIZE_MAX.
+
 2008-10-02  Jeff Johnston  <jjohnstn@redhat.com>
 
 	* libc/sys/linux/include/stdint.h (SIZE_MAX): Fix value which should
diff --git a/newlib/libc/string/str-two-way.h b/newlib/libc/string/str-two-way.h
index ad71a2595..72b60c39c 100644
--- a/newlib/libc/string/str-two-way.h
+++ b/newlib/libc/string/str-two-way.h
@@ -114,7 +114,7 @@ critical_factorization (const unsigned char *needle, size_t needle_len,
   while (j + k < needle_len)
     {
       a = CANON_ELEMENT (needle[j + k]);
-      b = CANON_ELEMENT (needle[max_suffix + k]);
+      b = CANON_ELEMENT (needle[(size_t)(max_suffix + k)]);
       if (a < b)
 	{
 	  /* Suffix is smaller, period is entire prefix so far.  */