diff --git a/source/DataFormatters/CXXFormatterFunctions.cpp b/source/DataFormatters/CXXFormatterFunctions.cpp
index 20000a7..09832f9 100644
--- a/source/DataFormatters/CXXFormatterFunctions.cpp
+++ b/source/DataFormatters/CXXFormatterFunctions.cpp
@@ -264,7 +264,8 @@ ReadUTFBufferAndDumpToStream (ConversionResult (*ConvertFunction) (const SourceD
     if (!process_sp)
         return false;
 
-    const int origin_encoding = 8*sizeof(SourceDataType);
+    const int type_size = sizeof(SourceDataType);
+    const int origin_encoding = 8 * type_size ;
     if (origin_encoding != 8 && origin_encoding != 16 && origin_encoding != 32)
         return false;
     // if not UTF8, I need a conversion function to return proper UTF8
@@ -273,10 +274,10 @@ ReadUTFBufferAndDumpToStream (ConversionResult (*ConvertFunction) (const SourceD
 
     if (sourceSize == 0)
         sourceSize = process_sp->GetTarget().GetMaximumSizeOfStringSummary();
-    const int bufferSPSize = sourceSize * (origin_encoding >> 2);
+    const int bufferSPSize = sourceSize * type_size;
 
     Error error;
-    lldb::DataBufferSP buffer_sp(new DataBufferHeap(bufferSPSize,0));
+    lldb::DataBufferSP buffer_sp(new DataBufferHeap(bufferSPSize, 0));
     
     if (!buffer_sp->GetBytes())
         return false;
@@ -284,8 +285,23 @@ ReadUTFBufferAndDumpToStream (ConversionResult (*ConvertFunction) (const SourceD
     size_t data_read = process_sp->ReadMemoryFromInferior(location, (char*)buffer_sp->GetBytes(), bufferSPSize, error);
     if (error.Fail() || data_read == 0)
     {
-        stream.Printf("unable to read data");
-        return true;
+        bool found = false;
+        if (data_read && error.GetType() == eErrorTypePOSIX) {
+            // Determine if a null terminator was found in spite of an out-of-bounds read
+            if (error.GetError() == EIO || error.GetError() == EFAULT) {
+                char* buffer = reinterpret_cast<char *>(buffer_sp->GetBytes());
+                char terminator[4] = {'\0', '\0', '\0', '\0'};
+                assert(sizeof(terminator) >= type_size && "Atempting to read a wchar with more than 4 bytes per character!");
+
+                for (size_t i = 0; !found && (i + type_size <= data_read); i += type_size)
+                    if (::strncmp(&buffer[i], terminator, type_size) == 0)
+                        found = true; // null terminator
+            }
+        }
+        if (!found) {
+            stream.Printf("unable to read data");
+            return true;
+        }
     }
     
     DataExtractor data(buffer_sp, process_sp->GetByteOrder(), process_sp->GetAddressByteSize());
diff --git a/test/lang/cpp/char1632_t/TestChar1632T.py b/test/lang/cpp/char1632_t/TestChar1632T.py
index 17a6d7c..bd93ce8 100644
--- a/test/lang/cpp/char1632_t/TestChar1632T.py
+++ b/test/lang/cpp/char1632_t/TestChar1632T.py
@@ -20,7 +20,6 @@ class Char1632TestCase(TestBase):
         self.buildDsym()
         self.char1632()
 
-    @expectedFailureLinux # bugzilla 15038: missing wide char support on Linux
     @dwarf_test
     def test_with_dwarf(self):
         """Test that the C++11 support for char16_t and char32_t works correctly."""
diff --git a/test/lang/cpp/wchar_t/TestCxxWCharT.py b/test/lang/cpp/wchar_t/TestCxxWCharT.py
index 734f77b..52fab1f 100644
--- a/test/lang/cpp/wchar_t/TestCxxWCharT.py
+++ b/test/lang/cpp/wchar_t/TestCxxWCharT.py
@@ -20,7 +20,6 @@ class CxxWCharTTestCase(TestBase):
         self.buildDsym()
         self.wchar_t()
 
-    @expectedFailureLinux # bugzilla 15038: missing wide char support on Linux
     @dwarf_test
     def test_with_dwarf(self):
         """Test that C++ supports wchar_t correctly."""
