From cf1b43bf049ab1a4c9451cd39a836836d4d76b8d Mon Sep 17 00:00:00 2001 From: Joogab Yun Date: Thu, 2 May 2019 10:30:44 +0900 Subject: [PATCH] If the text size is too large, crash or deadlock will occur. So, we limit the length. 3 Dali::Toolkit::Text::ShapeText (text=..., lineBreakInfo=..., scripts=..., fonts=..., startCharacterIndex=startCharacterIndex@entry=0, startGlyphIndex=0, numberOfCharacters=numberOfCharacters@entry=51371, glyphs=..., glyphToCharacterMap=..., charactersPerGlyph=..., newParagraphGlyphs=...) at /usr/src/debug/dali-toolkit-1.3.50.1/build/tizen/dali-toolkit/../../../dali-toolkit/internal/text/shaper.cpp:200 ... currentIndex = 40291 numberOfGlyphsReserved = 66782 totalNumberOfGlyphs = 40203 numberOfNewGlyphs = 40203 glyphToCharacterMapBuffer = 0x9f85f8 glyphIndex = 40196 lastCharacter = 51371 lastGlyph = (gdb)bt 0 memmove () at /usr/src/debug//////////////glibc-2.24/string/../sysdeps/arm/memmove.S:124 1 0xaaa57450 in Dali::VectorAlgorithms::Insert (this=0x9c67f8, at=0x896204a0 "", from=0x9f85f8 "\022", to=, elementSize=36) at /usr/include/dali/public-api/common/dali-vector.h:373 2 0xaaa7d25e in Dali::Vector::Insert (to=, from=0x9f85f8, at=0x896204a0, this=0x9c67f8) at /usr/include/dali/public-api/common/dali-vector.h:624 3 Dali::Toolkit::Text::ShapeText (text=..., lineBreakInfo=..., scripts=..., fonts=..., startCharacterIndex=startCharacterIndex@entry=0, startGlyphIndex=0, numberOfCharacters=numberOfCharacters@entry=51371, glyphs=..., glyphToCharacterMap=..., charactersPerGlyph=..., newParagraphGlyphs=...) at /usr/src/debug/dali-toolkit-1.3.50.1/build/tizen/dali-toolkit/../../../dali-toolkit/internal/text/shaper.cpp:200 4 0xaaa85b68 in Dali::Toolkit::Text::Controller::Impl::UpdateModel (this=0x9f9760, operationsRequired=) at /usr/src/debug/dali-toolkit-1.3.50.1/build/tizen/dali-toolkit/../../../dali-toolkit/internal/text/text-controller-impl.cpp:1019 Change-Id: Ic903833a638afaeb8749dfd1f44cd1d40f5f6939 --- .../utc-Dali-Text-Controller.cpp | 38 ++++++++++++++++++++++ dali-toolkit/internal/text/text-controller.cpp | 10 +++++- 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/automated-tests/src/dali-toolkit-internal/utc-Dali-Text-Controller.cpp b/automated-tests/src/dali-toolkit-internal/utc-Dali-Text-Controller.cpp index 95f7697..e581626 100755 --- a/automated-tests/src/dali-toolkit-internal/utc-Dali-Text-Controller.cpp +++ b/automated-tests/src/dali-toolkit-internal/utc-Dali-Text-Controller.cpp @@ -1045,3 +1045,41 @@ int UtcDaliTextControllerSelectEvent(void) END_TEST; } + + +int UtcDaliTextControllerMaxLengthSetText(void) +{ + tet_infoline(" UtcDaliTextControllerMaxLengthSetText"); + ToolkitTestApplication application; + + // Creates a text controller. + ControllerPtr controller = Controller::New(); + + ConfigureTextLabel(controller); + + const Length MAX_TEXT_LENGTH = 1024u * 32u; + + // make over length world + int maxLength = (1024u * 32u) + 10u; + char world[maxLength]; + for( int i = 0; i < maxLength; i++ ) + { + world[i] = 'a'; + } + + // Set the text + std::string text(world); + controller->SetText( text ); + + // Perform a relayout + const Size size( Dali::Stage::GetCurrent().GetSize() ); + controller->Relayout(size); + + // check text length + controller->GetText( text ); + Length textSize = text.size(); + + DALI_TEST_EQUALS( MAX_TEXT_LENGTH, textSize, TEST_LOCATION ); + + END_TEST; +} diff --git a/dali-toolkit/internal/text/text-controller.cpp b/dali-toolkit/internal/text/text-controller.cpp index e0c63c8..36314c9 100755 --- a/dali-toolkit/internal/text/text-controller.cpp +++ b/dali-toolkit/internal/text/text-controller.cpp @@ -61,6 +61,7 @@ const char * const PLACEHOLDER_FONT_STYLE = "fontStyle"; const char * const PLACEHOLDER_POINT_SIZE = "pointSize"; const char * const PLACEHOLDER_PIXEL_SIZE = "pixelSize"; const char * const PLACEHOLDER_ELLIPSIS = "ellipsis"; +const unsigned int MAX_TEXT_LENGTH = 1024u * 32u; float ConvertToEven( float value ) { @@ -309,7 +310,7 @@ bool Controller::IsSmoothHandlePanEnabled() const void Controller::SetMaximumNumberOfCharacters( Length maxCharacters ) { - mImpl->mMaximumNumberOfCharacters = maxCharacters; + mImpl->mMaximumNumberOfCharacters = std::min( maxCharacters, MAX_TEXT_LENGTH ); } int Controller::GetMaximumNumberOfCharacters() @@ -592,6 +593,13 @@ void Controller::SetText( const std::string& text ) utf8 = reinterpret_cast( text.c_str() ); } + // Limit the text size. If the text size is too large, crash or deadlock will occur. + if( textSize > MAX_TEXT_LENGTH ) + { + DALI_LOG_WARNING( "The text size is too large(%d), limit the length to 32,768u\n", textSize ); + textSize = MAX_TEXT_LENGTH; + } + // Convert text into UTF-32 Vector& utf32Characters = mImpl->mModel->mLogicalModel->mText; utf32Characters.Resize( textSize ); -- 2.7.4