1 Index: test/cintltst/utexttst.c 2 =================================================================== 3 --- test/cintltst/utexttst.c (revision 29355) 4 +++ test/cintltst/utexttst.c (revision 29356) 5 @@ -1,6 +1,6 @@ 6 /******************************************************************** 7 * COPYRIGHT: 8 - * Copyright (c) 2005-2009, International Business Machines Corporation and 9 + * Copyright (c) 2005-2011, International Business Machines Corporation and 10 * others. All Rights Reserved. 11 ********************************************************************/ 12 /* 13 @@ -210,6 +210,10 @@ 14 UChar uString[] = {0x41, 0x42, 0x43, 0}; 15 UChar buf[100]; 16 int32_t i; 17 + /* Test pinning of input bounds */ 18 + UChar uString2[] = {0x41, 0x42, 0x43, 0x44, 0x45, 19 + 0x46, 0x47, 0x48, 0x49, 0x4A, 0}; 20 + UChar * uString2Ptr = uString2 + 5; 21 22 status = U_ZERO_ERROR; 23 uta = utext_openUChars(NULL, uString, -1, &status); 24 @@ -228,6 +232,20 @@ 25 i = u_strcmp(uString, buf); 26 TEST_ASSERT(i == 0); 27 utext_close(uta); 28 + 29 + /* Test pinning of input bounds */ 30 + status = U_ZERO_ERROR; 31 + uta = utext_openUChars(NULL, uString2Ptr, -1, &status); 32 + TEST_SUCCESS(status); 33 + 34 + status = U_ZERO_ERROR; 35 + memset(buf, 0, sizeof(buf)); 36 + i = utext_extract(uta, -3, 20, buf, 100, &status); 37 + TEST_SUCCESS(status); 38 + TEST_ASSERT(i == u_strlen(uString2Ptr)); 39 + i = u_strcmp(uString2Ptr, buf); 40 + TEST_ASSERT(i == 0); 41 + utext_close(uta); 42 } 43 44 { 45 Index: common/utext.cpp 46 =================================================================== 47 --- common/utext.cpp (revision 29355) 48 +++ common/utext.cpp (revision 29356) 49 @@ -1,7 +1,7 @@ 50 /* 51 ******************************************************************************* 52 * 53 -* Copyright (C) 2005-2010, International Business Machines 54 +* Copyright (C) 2005-2011, International Business Machines 55 * Corporation and others. All Rights Reserved. 56 * 57 ******************************************************************************* 58 @@ -2846,7 +2846,6 @@ 59 return 0; 60 } 61 62 - const UChar *s=(const UChar *)ut->context; 63 int32_t si, di; 64 65 int32_t start32; 66 @@ -2856,8 +2855,8 @@ 67 // Pins 'start' to the length of the string, if it came in out-of-bounds. 68 // Snaps 'start' to the beginning of a code point. 69 ucstrTextAccess(ut, start, TRUE); 70 - U_ASSERT(start <= INT32_MAX); 71 - start32 = (int32_t)start; 72 + const UChar *s=ut->chunkContents; 73 + start32 = ut->chunkOffset; 74 75 int32_t strLength=(int32_t)ut->a; 76 if (strLength >= 0) { 77