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) {