[ https://issues.apache.org/jira/browse/LOGCXX-398?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13895997#comment-13895997 ]
Thorsten Schöning commented on LOGCXX-398: ------------------------------------------ Should we really append LOSSCHAR or throw an exception on invalid input? I would prefer the latter, else everythign looks like it works but we already know there's something wrong with the input and the intention of the caller. > Infinite loop in Transcoder::encode(const LogString& src, std::wstring& dst) > ---------------------------------------------------------------------------- > > Key: LOGCXX-398 > URL: https://issues.apache.org/jira/browse/LOGCXX-398 > Project: Log4cxx > Issue Type: Bug > Components: Appender > Affects Versions: 0.10.0 > Reporter: Brian Hayes > Assignee: Curt Arnold > Priority: Critical > Original Estimate: 1h > Remaining Estimate: 1h > > When building log4cxx as multi byte instead of wchar_t there's a bug in > Transcoder::encode(const LogString& src, std::wstring& dst). > void Transcoder::encode(const LogString& src, std::wstring& dst) { > #if LOG4CXX_LOGCHAR_IS_WCHAR_T > dst.append(src); > #else > for(LogString::const_iterator i = src.begin(); > i != src.end();) { > unsigned int cp = Transcoder::decode(src, i); > encode(cp, dst); > } > #endif > } > > If you pass an invalid multibyte string for src the Transcoder::decode > function will return 0xffff and not advance the iterator i. The encode will > then stick cp into dst over and over. Depending on whether your 32bit or > 64bit you either get a crash when you blow past your 2/4 GB address space, or > in 64bit you use up all available system resources and essentially lock up > the OS. > Here's the fix I've applied to my local version. It now does the same thing > that Transcoder::decode() above it does, insert a LOSSCHAR and advance the > iterator. > void Transcoder::encode(const LogString& src, std::wstring& dst) { > #if LOG4CXX_LOGCHAR_IS_WCHAR_T > dst.append(src); > #else > for(LogString::const_iterator i = src.begin(); > i != src.end();) { > unsigned int cp = Transcoder::decode(src, i); > if (cp != 0xFFFF) { > encode(cp, dst); > } else { > dst.append(1, LOSSCHAR); > i++; > } > } > #endif > } > -- This message was sent by Atlassian JIRA (v6.1.5#6160)