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