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