Author: orw Date: Mon Nov 19 10:10:46 2012 New Revision: 1411116 URL: http://svn.apache.org/viewvc?rev=1411116&view=rev Log: #121139# - string handling: clear reference counting and passing ownership
Found by: Regina Henschel, Ariel Constenla-Haile Review by: Herbert Duerr Modified: incubator/ooo/trunk/main/i18npool/source/characterclassification/cclass_unicode.cxx incubator/ooo/trunk/main/i18npool/source/nativenumber/nativenumbersupplier.cxx incubator/ooo/trunk/main/i18npool/source/textconversion/textconversion_ko.cxx incubator/ooo/trunk/main/i18npool/source/textconversion/textconversion_zh.cxx incubator/ooo/trunk/main/i18npool/source/transliteration/ignoreIandEfollowedByYa_ja_JP.cxx incubator/ooo/trunk/main/i18npool/source/transliteration/ignoreIterationMark_ja_JP.cxx incubator/ooo/trunk/main/i18npool/source/transliteration/ignoreKiKuFollowedBySa_ja_JP.cxx incubator/ooo/trunk/main/i18npool/source/transliteration/ignoreProlongedSoundMark_ja_JP.cxx incubator/ooo/trunk/main/i18npool/source/transliteration/transliteration_Ignore.cxx incubator/ooo/trunk/main/i18npool/source/transliteration/transliteration_Numeric.cxx incubator/ooo/trunk/main/i18npool/source/transliteration/transliteration_OneToOne.cxx incubator/ooo/trunk/main/i18npool/source/transliteration/transliteration_body.cxx incubator/ooo/trunk/main/i18nutil/inc/i18nutil/x_rtl_ustring.h incubator/ooo/trunk/main/i18nutil/source/utility/widthfolding.cxx Modified: incubator/ooo/trunk/main/i18npool/source/characterclassification/cclass_unicode.cxx URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/i18npool/source/characterclassification/cclass_unicode.cxx?rev=1411116&r1=1411115&r2=1411116&view=diff ============================================================================== --- incubator/ooo/trunk/main/i18npool/source/characterclassification/cclass_unicode.cxx (original) +++ incubator/ooo/trunk/main/i18npool/source/characterclassification/cclass_unicode.cxx Mon Nov 19 10:10:46 2012 @@ -94,7 +94,7 @@ cclass_Unicode::toTitle( const OUString& nCount = len - nPos; trans->setMappingType(MappingTypeToTitle, rLocale); - rtl_uString* pStr = x_rtl_uString_new_WithLength( nCount, 1 ); + rtl_uString* pStr = x_rtl_uString_new_WithLength( nCount ); // defined in x_rtl_ustring.h sal_Unicode* out = pStr->buffer; BreakIteratorImpl brk(xMSF); Boundary bdy = brk.getWordBoundary(Text, nPos, rLocale, Modified: incubator/ooo/trunk/main/i18npool/source/nativenumber/nativenumbersupplier.cxx URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/i18npool/source/nativenumber/nativenumbersupplier.cxx?rev=1411116&r1=1411115&r2=1411116&view=diff ============================================================================== --- incubator/ooo/trunk/main/i18npool/source/nativenumber/nativenumbersupplier.cxx (original) +++ incubator/ooo/trunk/main/i18npool/source/nativenumber/nativenumbersupplier.cxx Mon Nov 19 10:10:46 2012 @@ -73,7 +73,7 @@ OUString SAL_CALL AsciiToNativeChar( con Sequence< sal_Int32 >& offset, sal_Bool useOffset, sal_Int16 number ) throw(RuntimeException) { const sal_Unicode *src = inStr.getStr() + startPos; - rtl_uString *newStr = x_rtl_uString_new_WithLength(nCount); + rtl_uString *newStr = x_rtl_uString_new_WithLength( nCount ); // defined in x_rtl_ustring.h if (useOffset) offset.realloc(nCount); @@ -93,7 +93,7 @@ OUString SAL_CALL AsciiToNativeChar( con if (useOffset) offset[i] = startPos + i; } - return OUString( newStr, SAL_NO_ACQUIRE); + return OUString( newStr, SAL_NO_ACQUIRE); // take over ownership of <newStr> } sal_Bool SAL_CALL AsciiToNative_numberMaker(const sal_Unicode *str, sal_Int32 begin, sal_Int32 len, @@ -246,7 +246,10 @@ OUString SAL_CALL AsciiToNative( const O if (useOffset) offset.realloc(count); - return OUString(newStr->buffer, count); + OUString resultStr( newStr->buffer, count ); + x_rtl_uString_release( newStr ); + x_rtl_uString_release( srcStr ); + return resultStr; } return OUString(); } @@ -309,7 +312,7 @@ static OUString SAL_CALL NativeToAscii(c if (nCount > 0) { const sal_Unicode *str = inStr.getStr() + startPos; - rtl_uString *newStr = x_rtl_uString_new_WithLength(nCount * MultiplierExponent_7_CJK[0] + 1); + rtl_uString *newStr = x_rtl_uString_new_WithLength( nCount * MultiplierExponent_7_CJK[0] + 1 ); if (useOffset) offset.realloc( nCount * MultiplierExponent_7_CJK[0] + 1 ); sal_Int32 count = 0, index; @@ -367,7 +370,9 @@ static OUString SAL_CALL NativeToAscii(c for (i = 0; i < count; i++) offset[i] += startPos; } - return OUString(newStr->buffer, count); + OUString resultStr( newStr->buffer, count ); + x_rtl_uString_release( newStr ); + return resultStr; } return OUString(); } Modified: incubator/ooo/trunk/main/i18npool/source/textconversion/textconversion_ko.cxx URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/i18npool/source/textconversion/textconversion_ko.cxx?rev=1411116&r1=1411115&r2=1411116&view=diff ============================================================================== --- incubator/ooo/trunk/main/i18npool/source/textconversion/textconversion_ko.cxx (original) +++ incubator/ooo/trunk/main/i18npool/source/textconversion/textconversion_ko.cxx Mon Nov 19 10:10:46 2012 @@ -155,7 +155,8 @@ TextConversion_ko::getCharConversions(co } else if (! toHanja && getHanja2HangulIndex && getHanja2HangulData) { rtl_uString * newStr = x_rtl_uString_new_WithLength( nLength ); // defined in x_rtl_ustring.h sal_Int32 count = 0; - while (count < nLength) { + while (count < nLength) + { ch = aText[nStartPos + count]; sal_Unicode address = getHanja2HangulIndex()[ch>>8]; if (address != 0xFFFF) @@ -166,10 +167,12 @@ TextConversion_ko::getCharConversions(co else break; } - if (count > 0) { + if (count > 0) + { output.realloc(1); - output[0] = OUString( newStr->buffer, count); + output[0] = OUString( newStr->buffer, count ); } + x_rtl_uString_release( newStr ); } return output; } Modified: incubator/ooo/trunk/main/i18npool/source/textconversion/textconversion_zh.cxx URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/i18npool/source/textconversion/textconversion_zh.cxx?rev=1411116&r1=1411115&r2=1411116&view=diff ============================================================================== --- incubator/ooo/trunk/main/i18npool/source/textconversion/textconversion_zh.cxx (original) +++ incubator/ooo/trunk/main/i18npool/source/textconversion/textconversion_zh.cxx Mon Nov 19 10:10:46 2012 @@ -84,7 +84,7 @@ TextConversion_zh::getCharConversion(con for (sal_Int32 i = 0; i < nLength; i++) newStr->buffer[i] = getOneCharConversion(aText[nStartPos+i], Data, Index); - return OUString( newStr, SAL_NO_ACQUIRE); + return OUString( newStr, SAL_NO_ACQUIRE ); // take over ownership of <newStr> } OUString SAL_CALL @@ -214,7 +214,9 @@ TextConversion_zh::getWordConversion(con } if (offset.getLength() > 0) offset.realloc(one2one ? 0 : count); - return OUString( newStr->buffer, count); + OUString resultStr( newStr->buffer, count ); + x_rtl_uString_release( newStr ); + return resultStr; } TextConversionResult SAL_CALL Modified: incubator/ooo/trunk/main/i18npool/source/transliteration/ignoreIandEfollowedByYa_ja_JP.cxx URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/i18npool/source/transliteration/ignoreIandEfollowedByYa_ja_JP.cxx?rev=1411116&r1=1411115&r2=1411116&view=diff ============================================================================== --- incubator/ooo/trunk/main/i18npool/source/transliteration/ignoreIandEfollowedByYa_ja_JP.cxx (original) +++ incubator/ooo/trunk/main/i18npool/source/transliteration/ignoreIandEfollowedByYa_ja_JP.cxx Mon Nov 19 10:10:46 2012 @@ -139,7 +139,7 @@ ignoreIandEfollowedByYa_ja_JP::folding( newStr->length = sal_Int32(dst - newStr->buffer); if (useOffset) offset.realloc(newStr->length); - return OUString( newStr ); // defined in rtl/usrting. The reference count is increased from 0 to 1. + return OUString( newStr, SAL_NO_ACQUIRE ); // take over ownership of <newStr> } } } } } Modified: incubator/ooo/trunk/main/i18npool/source/transliteration/ignoreIterationMark_ja_JP.cxx URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/i18npool/source/transliteration/ignoreIterationMark_ja_JP.cxx?rev=1411116&r1=1411115&r2=1411116&view=diff ============================================================================== --- incubator/ooo/trunk/main/i18npool/source/transliteration/ignoreIterationMark_ja_JP.cxx (original) +++ incubator/ooo/trunk/main/i18npool/source/transliteration/ignoreIterationMark_ja_JP.cxx Mon Nov 19 10:10:46 2012 @@ -146,7 +146,7 @@ ignoreIterationMark_ja_JP::folding( cons newStr->length = sal_Int32(dst - newStr->buffer); if (useOffset) offset.realloc(newStr->length); - return OUString( newStr ); // defined in rtl/usrting. The reference count is increased from 0 to 1. + return OUString( newStr, SAL_NO_ACQUIRE ); // take over ownership of <newStr> } Modified: incubator/ooo/trunk/main/i18npool/source/transliteration/ignoreKiKuFollowedBySa_ja_JP.cxx URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/i18npool/source/transliteration/ignoreKiKuFollowedBySa_ja_JP.cxx?rev=1411116&r1=1411115&r2=1411116&view=diff ============================================================================== --- incubator/ooo/trunk/main/i18npool/source/transliteration/ignoreKiKuFollowedBySa_ja_JP.cxx (original) +++ incubator/ooo/trunk/main/i18npool/source/transliteration/ignoreKiKuFollowedBySa_ja_JP.cxx Mon Nov 19 10:10:46 2012 @@ -96,7 +96,7 @@ ignoreKiKuFollowedBySa_ja_JP::folding( c newStr->length = sal_Int32(dst - newStr->buffer); if (useOffset) offset.realloc(newStr->length); - return OUString( newStr ); // defined in rtl/usrting. The reference count is increased from 0 to 1. + return OUString( newStr, SAL_NO_ACQUIRE ); // take over ownership of <newStr> } } } } } Modified: incubator/ooo/trunk/main/i18npool/source/transliteration/ignoreProlongedSoundMark_ja_JP.cxx URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/i18npool/source/transliteration/ignoreProlongedSoundMark_ja_JP.cxx?rev=1411116&r1=1411115&r2=1411116&view=diff ============================================================================== --- incubator/ooo/trunk/main/i18npool/source/transliteration/ignoreProlongedSoundMark_ja_JP.cxx (original) +++ incubator/ooo/trunk/main/i18npool/source/transliteration/ignoreProlongedSoundMark_ja_JP.cxx Mon Nov 19 10:10:46 2012 @@ -354,7 +354,7 @@ ignoreProlongedSoundMark_ja_JP::folding( newStr->length = sal_Int32(dst - newStr->buffer); if (useOffset) offset.realloc(newStr->length); - return OUString( newStr ); // defined in rtl/usrting. The reference count is increased from 0 to 1. + return OUString( newStr, SAL_NO_ACQUIRE ); // take over ownership of <newStr> } Modified: incubator/ooo/trunk/main/i18npool/source/transliteration/transliteration_Ignore.cxx URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/i18npool/source/transliteration/transliteration_Ignore.cxx?rev=1411116&r1=1411115&r2=1411116&view=diff ============================================================================== --- incubator/ooo/trunk/main/i18npool/source/transliteration/transliteration_Ignore.cxx (original) +++ incubator/ooo/trunk/main/i18npool/source/transliteration/transliteration_Ignore.cxx Mon Nov 19 10:10:46 2012 @@ -204,7 +204,7 @@ transliteration_Ignore::folding( const O offset.realloc(newStr->length); *dst = (sal_Unicode) 0; - return OUString( newStr ); // defined in rtl/usrting. The reference count is increased from 0 to 1. + return OUString( newStr, SAL_NO_ACQUIRE ); // take over ownership of <newStr> } sal_Unicode SAL_CALL Modified: incubator/ooo/trunk/main/i18npool/source/transliteration/transliteration_Numeric.cxx URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/i18npool/source/transliteration/transliteration_Numeric.cxx?rev=1411116&r1=1411115&r2=1411116&view=diff ============================================================================== --- incubator/ooo/trunk/main/i18npool/source/transliteration/transliteration_Numeric.cxx (original) +++ incubator/ooo/trunk/main/i18npool/source/transliteration/transliteration_Numeric.cxx Mon Nov 19 10:10:46 2012 @@ -72,7 +72,7 @@ transliteration_Numeric::transliterateBu if (endPos > inStr.getLength()) endPos = inStr.getLength(); - rtl_uString* pStr = x_rtl_uString_new_WithLength( nCount, 1 ); // our x_rtl_ustring.h + rtl_uString* pStr = x_rtl_uString_new_WithLength( nCount ); // our x_rtl_ustring.h sal_Unicode* out = pStr->buffer; if (useOffset) @@ -114,7 +114,7 @@ transliteration_Numeric::transliterateBu if (useOffset) offset.realloc(j); - return OUString( pStr, SAL_NO_ACQUIRE ); + return OUString( pStr, SAL_NO_ACQUIRE ); // take over ownership of <pStr> } OUString SAL_CALL Modified: incubator/ooo/trunk/main/i18npool/source/transliteration/transliteration_OneToOne.cxx URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/i18npool/source/transliteration/transliteration_OneToOne.cxx?rev=1411116&r1=1411115&r2=1411116&view=diff ============================================================================== --- incubator/ooo/trunk/main/i18npool/source/transliteration/transliteration_OneToOne.cxx (original) +++ incubator/ooo/trunk/main/i18npool/source/transliteration/transliteration_OneToOne.cxx Mon Nov 19 10:10:46 2012 @@ -91,7 +91,7 @@ transliteration_OneToOne::transliterate( } *dst = (sal_Unicode) 0; - return OUString( newStr ); // defined in rtl/usrting. The reference count is increased from 0 to 1. + return OUString( newStr, SAL_NO_ACQUIRE ); // take over ownership of <newStr> } sal_Unicode SAL_CALL Modified: incubator/ooo/trunk/main/i18npool/source/transliteration/transliteration_body.cxx URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/i18npool/source/transliteration/transliteration_body.cxx?rev=1411116&r1=1411115&r2=1411116&view=diff ============================================================================== --- incubator/ooo/trunk/main/i18npool/source/transliteration/transliteration_body.cxx (original) +++ incubator/ooo/trunk/main/i18npool/source/transliteration/transliteration_body.cxx Mon Nov 19 10:10:46 2012 @@ -183,7 +183,7 @@ Transliteration_body::transliterate( const Mapping &map = casefolding::getValue( in, i, nCount, aLocale, nTmpMappingType ); nOffCount += map.nmap; } - rtl_uString* pStr = x_rtl_uString_new_WithLength( nOffCount, 1 ); // our x_rtl_ustring.h + rtl_uString* pStr = x_rtl_uString_new_WithLength( nOffCount ); // our x_rtl_ustring.h sal_Unicode* out = pStr->buffer; if ( nOffCount != offset.getLength() ) @@ -207,7 +207,7 @@ Transliteration_body::transliterate( } out[j] = 0; - return OUString( pStr, SAL_NO_ACQUIRE ); + return OUString( pStr, SAL_NO_ACQUIRE ); // take over ownership of <pStr> } else { @@ -254,7 +254,7 @@ OUString SAL_CALL Transliteration_body::transliterateChar2String( sal_Unicode inChar ) throw(RuntimeException) { const Mapping &map = casefolding::getValue(&inChar, 0, 1, aLocale, nMappingType); - rtl_uString* pStr = x_rtl_uString_new_WithLength( map.nmap, 1 ); // our x_rtl_ustring.h + rtl_uString* pStr = x_rtl_uString_new_WithLength( map.nmap ); // our x_rtl_ustring.h sal_Unicode* out = pStr->buffer; sal_Int32 i; @@ -262,7 +262,7 @@ Transliteration_body::transliterateChar2 out[i] = map.map[i]; out[i] = 0; - return OUString( pStr, SAL_NO_ACQUIRE ); + return OUString( pStr, SAL_NO_ACQUIRE ); // take over ownership of <pStr> } sal_Unicode SAL_CALL Modified: incubator/ooo/trunk/main/i18nutil/inc/i18nutil/x_rtl_ustring.h URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/i18nutil/inc/i18nutil/x_rtl_ustring.h?rev=1411116&r1=1411115&r2=1411116&view=diff ============================================================================== --- incubator/ooo/trunk/main/i18nutil/inc/i18nutil/x_rtl_ustring.h (original) +++ incubator/ooo/trunk/main/i18nutil/inc/i18nutil/x_rtl_ustring.h Mon Nov 19 10:10:46 2012 @@ -32,18 +32,15 @@ /** * Allocates a new <code>rtl_uString</code> which can hold nLen + 1 characters. - * The reference count is 0. The characters of room is not cleared. - * This method is similar to rtl_uString_new_WithLength in rtl/ustring.h, but - * can allocate a new string more efficiently. You need to "acquire" by such as - * OUString( rtl_uString * value ) if you intend to use it for a while. - * @param [output] newStr + * The reference count is 1. The memory allocated for the characters is not initialized. * @param [input] nLen */ -inline void SAL_CALL x_rtl_uString_new_WithLength( rtl_uString ** newStr, sal_Int32 nLen, sal_Int32 _refCount = 0 ) +inline rtl_uString * SAL_CALL x_rtl_uString_new_WithLength( sal_Int32 nLen ) { - *newStr = (rtl_uString*) rtl_allocateMemory ( sizeof(rtl_uString) + sizeof(sal_Unicode) * nLen); - (*newStr)->refCount = _refCount; - (*newStr)->length = nLen; + rtl_uString *newStr = (rtl_uString*) rtl_allocateMemory ( sizeof(rtl_uString) + sizeof(sal_Unicode) * nLen); + newStr->refCount = 1; + newStr->length = nLen; + return newStr; // rtl_uString is defined in rtl/ustring.h as below: //typedef struct _rtl_uString @@ -52,15 +49,7 @@ inline void SAL_CALL x_rtl_uString_new_W // sal_Int32 length; // sal_Unicode buffer[1]; //} rtl_uString; -} - -inline rtl_uString * SAL_CALL x_rtl_uString_new_WithLength( sal_Int32 nLen, sal_Int32 _refCount = 0 ) -{ - rtl_uString *newStr = (rtl_uString*) rtl_allocateMemory ( sizeof(rtl_uString) + sizeof(sal_Unicode) * nLen); - newStr->refCount = _refCount; - newStr->length = nLen; - return newStr; -} +} /** * Release <code>rtl_uString</code> regardless its reference count. Modified: incubator/ooo/trunk/main/i18nutil/source/utility/widthfolding.cxx URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/i18nutil/source/utility/widthfolding.cxx?rev=1411116&r1=1411115&r2=1411116&view=diff ============================================================================== --- incubator/ooo/trunk/main/i18nutil/source/utility/widthfolding.cxx (original) +++ incubator/ooo/trunk/main/i18nutil/source/utility/widthfolding.cxx Mon Nov 19 10:10:46 2012 @@ -49,8 +49,7 @@ OUString widthfolding::decompose_ja_voic { // Create a string buffer which can hold nCount * 2 + 1 characters. // Its size may become double of nCount. - rtl_uString * newStr; - x_rtl_uString_new_WithLength( &newStr, nCount * 2 ); // defined in x_rtl_ustring.h The reference count is 0 now. + rtl_uString * newStr = x_rtl_uString_new_WithLength( nCount * 2 ); // defined in x_rtl_ustring.h sal_Int32 *p = NULL; sal_Int32 position = 0; @@ -94,7 +93,7 @@ OUString widthfolding::decompose_ja_voic newStr->length = sal_Int32(dst - newStr->buffer); if (useOffset) offset.realloc(newStr->length); - return OUString( newStr ); // defined in rtl/usrting. The reference count is increased from 0 to 1. + return OUString( newStr, SAL_NO_ACQUIRE ); // take over ownership of <newStr> } oneToOneMapping& widthfolding::getfull2halfTable(void) @@ -111,8 +110,7 @@ OUString widthfolding::compose_ja_voiced { // Create a string buffer which can hold nCount + 1 characters. // Its size may become equal to nCount or smaller. - // The reference count is 0 now. - rtl_uString * newStr = x_rtl_uString_new_WithLength( nCount ); // defined in x_rtl_ustring.h + rtl_uString * newStr = x_rtl_uString_new_WithLength( nCount ); // defined in x_rtl_ustring.h // Prepare pointers of unicode character arrays. const sal_Unicode* src = inStr.getStr() + startPos; @@ -199,7 +197,7 @@ OUString widthfolding::compose_ja_voiced } if (useOffset) offset.realloc(newStr->length); - return OUString( newStr ); // defined in rtl/usrting. The reference count is increased from 0 to 1. + return OUString( newStr, SAL_NO_ACQUIRE ); // take over ownership of <newStr> } oneToOneMapping& widthfolding::gethalf2fullTable(void)