@@ -111,18 +111,22 @@ class APRCharsetDecoder : public CharsetDecoder
111111 {
112112 size_t inbytes_left = in.remaining ();
113113 size_t initial_inbytes_left = inbytes_left;
114- size_t pos = in.position ();
115114 apr_size_t outbytes_left = initial_outbytes_left;
116115 {
117116 std::lock_guard<std::mutex> lock (mutex);
118117 stat = apr_xlate_conv_buffer ((apr_xlate_t *) convset,
119- in.data () + pos ,
118+ in.current () ,
120119 &inbytes_left,
121120 (char *) buf,
122121 &outbytes_left);
123122 }
124123 out.append (buf, (initial_outbytes_left - outbytes_left) / sizeof (logchar));
125- in.position (pos + (initial_inbytes_left - inbytes_left));
124+ if (inbytes_left == initial_inbytes_left && stat == APR_SUCCESS)
125+ {
126+ stat = APR_BADCH;
127+ break ;
128+ }
129+ in.increment_position (initial_inbytes_left - inbytes_left);
126130 }
127131 }
128132
@@ -181,7 +185,7 @@ class MbstowcsCharsetDecoder : public CharsetDecoder
181185 if (*src == 0 )
182186 {
183187 out.append (1 , (logchar) 0 );
184- in.position (in. position () + 1 );
188+ in.increment_position ( 1 );
185189 }
186190 else
187191 {
@@ -194,7 +198,7 @@ class MbstowcsCharsetDecoder : public CharsetDecoder
194198 BUFSIZE - 1 ,
195199 &mbstate);
196200 auto converted = src - cbuf;
197- in.position (in. position () + converted);
201+ in.increment_position ( converted);
198202
199203 if (wCharCount == (size_t ) -1 ) // Illegal byte sequence?
200204 {
@@ -260,10 +264,10 @@ class TrivialCharsetDecoder : public CharsetDecoder
260264
261265 if ( remaining > 0 )
262266 {
263- const logchar* src = ( const logchar*) ( in.data () + in. position () );
264- size_t count = remaining / sizeof (logchar);
265- out.append (src, count);
266- in.position (in. position () + remaining);
267+ auto src = in.current ( );
268+ auto count = remaining / sizeof (logchar);
269+ out.append (reinterpret_cast < const logchar*>( src) , count);
270+ in.increment_position ( remaining);
267271 }
268272
269273 return APR_SUCCESS;
@@ -299,30 +303,29 @@ class UTF8CharsetDecoder : public CharsetDecoder
299303 virtual log4cxx_status_t decode (ByteBuffer& in,
300304 LogString& out)
301305 {
302- if (in.remaining () > 0 )
306+ auto availableByteCount = in.remaining ();
307+ std::string tmp (in.current (), availableByteCount);
308+ std::string::const_iterator nextCodePoint = tmp.begin ();
309+
310+ while (nextCodePoint != tmp.end ())
303311 {
304- std::string tmp (in. current (), in. remaining ()) ;
305- std::string::const_iterator iter = tmp. begin ( );
312+ auto lastCodePoint = nextCodePoint ;
313+ auto sv = Transcoder::decode (tmp, nextCodePoint );
306314
307- while (iter != tmp. end () )
315+ if (sv == 0xFFFF || nextCodePoint == lastCodePoint )
308316 {
309- unsigned int sv = Transcoder::decode (tmp, iter);
310-
311- if (sv == 0xFFFF )
312- {
313- size_t offset = iter - tmp.begin ();
314- in.position (in.position () + offset);
315- return APR_BADARG;
316- }
317- else
318- {
319- Transcoder::encode (sv, out);
320- }
317+ size_t offset = nextCodePoint - tmp.begin ();
318+ in.increment_position (offset);
319+ return APR_BADCH;
320+ }
321+ else
322+ {
323+ Transcoder::encode (sv, out);
321324 }
322-
323- in.position (in.limit ());
324325 }
325326
327+ in.increment_position (availableByteCount);
328+
326329 return APR_SUCCESS;
327330 }
328331
@@ -351,20 +354,16 @@ class ISOLatinCharsetDecoder : public CharsetDecoder
351354 virtual log4cxx_status_t decode (ByteBuffer& in,
352355 LogString& out)
353356 {
354- if (in.remaining () > 0 )
355- {
356-
357- const unsigned char * src = (unsigned char *) in.current ();
358- const unsigned char * srcEnd = src + in.remaining ();
357+ auto availableByteCount = in.remaining ();
358+ auto src = in.current ();
359+ auto srcEnd = src + availableByteCount;
359360
360- while (src < srcEnd)
361- {
362- unsigned int sv = *(src++);
363- Transcoder::encode (sv, out);
364- }
365-
366- in.position (in.limit ());
361+ while (src < srcEnd)
362+ {
363+ auto sv = static_cast <unsigned int >(*src++);
364+ Transcoder::encode (sv, out);
367365 }
366+ in.increment_position (availableByteCount);
368367
369368 return APR_SUCCESS;
370369 }
@@ -399,30 +398,26 @@ class USASCIICharsetDecoder : public CharsetDecoder
399398 {
400399 log4cxx_status_t stat = APR_SUCCESS;
401400
402- if (in.remaining () > 0 )
401+ auto availableByteCount = in.remaining ();
402+ auto src = in.current ();
403+ auto srcEnd = src + availableByteCount;
404+ size_t byteCount = 0 ;
405+ while (src < srcEnd)
403406 {
407+ auto sv = static_cast <unsigned int >(*src++);
404408
405- const unsigned char * src = (unsigned char *) in.current ();
406- const unsigned char * srcEnd = src + in.remaining ();
407-
408- while (src < srcEnd)
409+ if (sv < 0x80 )
409410 {
410- unsigned char sv = *src;
411-
412- if (sv < 0x80 )
413- {
414- src++;
415- Transcoder::encode (sv, out);
416- }
417- else
418- {
419- stat = APR_BADARG;
420- break ;
421- }
411+ ++byteCount;
412+ Transcoder::encode (sv, out);
413+ }
414+ else
415+ {
416+ stat = APR_BADCH;
417+ break ;
422418 }
423-
424- in.position (src - (const unsigned char *) in.data ());
425419 }
420+ in.increment_position (byteCount);
426421
427422 return stat;
428423 }
@@ -446,44 +441,43 @@ class LocaleCharsetDecoder : public CharsetDecoder
446441 log4cxx_status_t decode (ByteBuffer& in, LogString& out) override
447442 {
448443 log4cxx_status_t result = APR_SUCCESS;
449- const char * p = in.current ();
450- size_t i = in.position ();
451- size_t remain = in. limit () - i ;
444+ auto p = in.current ();
445+ auto availableByteCount = in.remaining ();
446+ size_t byteCount = 0 ;
452447#if !LOG4CXX_CHARSET_EBCDIC
453448 if (std::mbsinit (&this ->state )) // ByteBuffer not partially decoded?
454449 {
455450 // Copy single byte characters
456- for (; 0 < remain && (( unsigned int ) *p) < 0x80 ; --remain, ++i, p++ )
451+ for (; byteCount < availableByteCount && static_cast < unsigned int >( *p) < 0x80 ; ++byteCount, ++p )
457452 {
458453 out.append (1 , *p);
459454 }
460455 }
461456#endif
462457 // Decode characters that may be represented by multiple bytes
463- while (0 < remain )
458+ while (byteCount < availableByteCount )
464459 {
465460 wchar_t ch = 0 ;
466- size_t n = std::mbrtowc (&ch, p, remain , &this ->state );
461+ size_t n = std::mbrtowc (&ch, p, availableByteCount - byteCount , &this ->state );
467462 if (0 == n) // NULL encountered?
468463 {
469- ++i ;
464+ ++byteCount ;
470465 break ;
471466 }
472467 if (static_cast <std::size_t >(-1 ) == n) // decoding error?
473468 {
474- result = APR_BADARG ;
469+ result = APR_BADCH ;
475470 break ;
476471 }
477472 if (static_cast <std::size_t >(-2 ) == n) // incomplete sequence?
478473 {
479474 break ;
480475 }
481476 Transcoder::encode (static_cast <unsigned int >(ch), out);
482- remain -= n;
483- i += n;
477+ byteCount += n;
484478 p += n;
485479 }
486- in.position (i );
480+ in.increment_position (byteCount );
487481 return result;
488482 }
489483
0 commit comments