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

Reply via email to