This is an automated email from the ASF dual-hosted git repository.

swebb2066 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/logging-log4cxx.git


The following commit(s) were added to refs/heads/master by this push:
     new 49361f32 Fix nullptr pointer arithmetic in charset decoder (#670)
49361f32 is described below

commit 49361f32c2696d4e8005166371445a7e5cf6649a
Author: metsw24-max <[email protected]>
AuthorDate: Fri May 15 13:04:49 2026 +0530

    Fix nullptr pointer arithmetic in charset decoder (#670)
---
 src/main/cpp/charsetdecoder.cpp | 21 ++++++++++++++++++++-
 1 file changed, 20 insertions(+), 1 deletion(-)

diff --git a/src/main/cpp/charsetdecoder.cpp b/src/main/cpp/charsetdecoder.cpp
index 569e7c5c..90977573 100644
--- a/src/main/cpp/charsetdecoder.cpp
+++ b/src/main/cpp/charsetdecoder.cpp
@@ -197,7 +197,26 @@ class MbstowcsCharsetDecoder : public CharsetDecoder
                                                        &src,
                                                        BUFSIZE - 1,
                                                        &mbstate);
-                                       auto converted = src - cbuf;
+                                       // mbsrtowcs sets *src to nullptr when 
it consumes a null wide character.
+                                       // Performing pointer arithmetic on 
that nullptr (src - cbuf) is undefined
+                                       // behaviour, so recover the consumed 
byte count from the position of the
+                                       // null that stopped the conversion 
instead.
+                                       size_t converted;
+                                       if (src == nullptr)
+                                       {
+                                               size_t nullPos = 0;
+                                               while (nullPos < available && 
cbuf[nullPos] != 0)
+                                               {
+                                                       ++nullPos;
+                                               }
+                                               // If the null came from the 
input bytes, it was consumed too;
+                                               // if it is the sentinel we 
wrote at cbuf[available], stop at available.
+                                               converted = (nullPos < 
available) ? nullPos + 1 : available;
+                                       }
+                                       else
+                                       {
+                                               converted = 
static_cast<size_t>(src - cbuf);
+                                       }
                                        in.increment_position(converted);
 
                                        if (wCharCount == (size_t) -1) // 
Illegal byte sequence?

Reply via email to