]> granicus.if.org Git - icu/commitdiff
ICU-13554 Out of bounds array access in locale getPosixID.
authorAndy Heninger <andy.heninger@gmail.com>
Fri, 18 May 2018 20:01:03 +0000 (20:01 +0000)
committerAndy Heninger <andy.heninger@gmail.com>
Fri, 18 May 2018 20:01:03 +0000 (20:01 +0000)
X-SVN-Rev: 41411

icu4c/source/common/locmap.cpp
icu4c/source/test/intltest/loctest.cpp
icu4c/source/test/intltest/loctest.h

index cbb2b810a58f2f2535bd4ca0f5a5ab58a4a387dd..6d62d8310c0d3bcd138d220c288025ee85f68ae0 100644 (file)
@@ -1015,7 +1015,7 @@ static const char*
 getPosixID(const ILcidPosixMap *this_0, uint32_t hostID)
 {
     uint32_t i;
-    for (i = 0; i <= this_0->numRegions; i++)
+    for (i = 0; i < this_0->numRegions; i++)
     {
         if (this_0->regionMaps[i].hostID == hostID)
         {
index 4eb5d97c314af16c37725abdacf23ceb9a8ee621..9994e81e3ed4e3941019a626623e935dbc810b3f 100644 (file)
 #include "unicode/dtfmtsym.h"
 #include "unicode/brkiter.h"
 #include "unicode/coll.h"
+#include "unicode/ustring.h"
 #include "charstr.h"
 #include "cmemory.h"
 #include "cstring.h"
 #include <stdio.h>
 #include <string.h>
 #include "putilimp.h"
-#include "unicode/ustring.h"
 #include "hash.h"
+#include "locmap.h"
 
 static const char* const rawData[33][8] = {
 
@@ -231,6 +232,7 @@ void LocaleTest::runIndexedTest( int32_t index, UBool exec, const char* &name, c
     TESTCASE_AUTO(TestGetVariantWithKeywords);
     TESTCASE_AUTO(TestIsRightToLeft);
     TESTCASE_AUTO(TestBug13277);
+    TESTCASE_AUTO(TestBug13554);
     TESTCASE_AUTO_END;
 }
 
@@ -2732,3 +2734,18 @@ void LocaleTest::TestBug13277() {
     }
 }
 
+// TestBug13554 Check for read past end of array in getPosixID().
+//              The bug shows as an Address Sanitizer failure.
+
+void LocaleTest::TestBug13554() {
+    UErrorCode status = U_ZERO_ERROR;
+    const int BUFFER_SIZE = 100;
+    char  posixID[BUFFER_SIZE];
+
+    for (uint32_t hostid = 0; hostid < 0x500; ++hostid) {
+        status = U_ZERO_ERROR;
+        uprv_convertToPosix(hostid, posixID, BUFFER_SIZE, &status);
+    }
+}
+
+
index 270f427952e51674e6b4acb320533fefa1fd1ee2..344e8816cc9ca5062ee8ccbe2886a877a62d3f74 100644 (file)
@@ -106,6 +106,7 @@ public:
     void TestIsRightToLeft();
     void TestBug11421();
     void TestBug13277();
+    void TestBug13554();
 
 private:
     void _checklocs(const char* label,