Index: test/cintltst/utexttst.c
===================================================================
--- test/cintltst/utexttst.c	(revision 29355)
+++ test/cintltst/utexttst.c	(revision 29356)
@@ -1,6 +1,6 @@
 /********************************************************************
  * COPYRIGHT: 
- * Copyright (c) 2005-2009, International Business Machines Corporation and
+ * Copyright (c) 2005-2011, International Business Machines Corporation and
  * others. All Rights Reserved.
  ********************************************************************/
 /*
@@ -210,6 +210,10 @@
         UChar     uString[]  = {0x41, 0x42, 0x43, 0};
         UChar     buf[100];
         int32_t   i;
+        /* Test pinning of input bounds */
+        UChar     uString2[]  = {0x41, 0x42, 0x43, 0x44, 0x45,
+                                 0x46, 0x47, 0x48, 0x49, 0x4A, 0};
+        UChar *   uString2Ptr = uString2 + 5;
 
         status = U_ZERO_ERROR;
         uta = utext_openUChars(NULL, uString, -1, &status);
@@ -228,6 +232,20 @@
         i = u_strcmp(uString, buf);
         TEST_ASSERT(i == 0);
         utext_close(uta);
+
+        /* Test pinning of input bounds */
+        status = U_ZERO_ERROR;
+        uta = utext_openUChars(NULL, uString2Ptr, -1, &status);
+        TEST_SUCCESS(status);
+
+        status = U_ZERO_ERROR;
+        memset(buf, 0, sizeof(buf));
+        i = utext_extract(uta, -3, 20, buf, 100, &status);
+        TEST_SUCCESS(status);
+        TEST_ASSERT(i == u_strlen(uString2Ptr));
+        i = u_strcmp(uString2Ptr, buf);
+        TEST_ASSERT(i == 0);
+        utext_close(uta);
     }
 
     {
Index: common/utext.cpp
===================================================================
--- common/utext.cpp	(revision 29355)
+++ common/utext.cpp	(revision 29356)
@@ -1,7 +1,7 @@
 /*
 *******************************************************************************
 *
-*   Copyright (C) 2005-2010, International Business Machines
+*   Copyright (C) 2005-2011, International Business Machines
 *   Corporation and others.  All Rights Reserved.
 *
 *******************************************************************************
@@ -2846,7 +2846,6 @@
         return 0;
     }
 
-    const UChar *s=(const UChar *)ut->context;
     int32_t si, di;
 
     int32_t start32;
@@ -2856,8 +2855,8 @@
     //   Pins 'start' to the length of the string, if it came in out-of-bounds.
     //   Snaps 'start' to the beginning of a code point.
     ucstrTextAccess(ut, start, TRUE);
-    U_ASSERT(start <= INT32_MAX);
-    start32 = (int32_t)start;
+    const UChar *s=ut->chunkContents;
+    start32 = ut->chunkOffset;
 
     int32_t strLength=(int32_t)ut->a;
     if (strLength >= 0) {