Fix Undefined-shift in ubidi_getRuns
Upstream PR: https://github.com/unicode-org/icu/pull/663
Bug: chromium:966377
Change-Id: Icde4128f0c333e6c1cf79704789f893b9a5f3780
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/deps/icu/+/1637963
Reviewed-by: Jungshik Shin <jshin@chromium.org>
diff --git a/README.chromium b/README.chromium
index c75f49a..5250aee 100644
--- a/README.chromium
+++ b/README.chromium
@@ -265,3 +265,10 @@
https://unicode-org.atlassian.net/browse/ICU-20595
- upstream PR:
https://github.com/unicode-org/icu/pull/649
+
+10. Bidi UBSan breakage patch
+ - patches/bidiunshift.patch
+ - upstream bug:
+ https://unicode-org.atlassian.net/browse/ICU-20641
+ - upstream PR:
+ https://github.com/unicode-org/icu/pull/663
diff --git a/patches/bidiunshift.patch b/patches/bidiunshift.patch
new file mode 100644
index 0000000..353a038
--- /dev/null
+++ b/patches/bidiunshift.patch
@@ -0,0 +1,15 @@
+diff --git a/source/common/ubidiimp.h b/source/common/ubidiimp.h
+index a5d07274..41bca38a 100644
+--- a/source/common/ubidiimp.h
++++ b/source/common/ubidiimp.h
+@@ -198,8 +198,8 @@ typedef struct Run {
+ /* in a Run, logicalStart will get this bit set if the run level is odd */
+ #define INDEX_ODD_BIT (1UL<<31)
+
+-#define MAKE_INDEX_ODD_PAIR(index, level) ((index)|((int32_t)(level)<<31))
+-#define ADD_ODD_BIT_FROM_LEVEL(x, level) ((x)|=((int32_t)(level)<<31))
++#define MAKE_INDEX_ODD_PAIR(index, level) ((index)|((int32_t)((level)&1)<<31))
++#define ADD_ODD_BIT_FROM_LEVEL(x, level) ((x)|=((int32_t)((level)&1)<<31))
+ #define REMOVE_ODD_BIT(x) ((x)&=~INDEX_ODD_BIT)
+
+ #define GET_INDEX(x) ((x)&~INDEX_ODD_BIT)
diff --git a/source/common/ubidiimp.h b/source/common/ubidiimp.h
index a5d0727..41bca38 100644
--- a/source/common/ubidiimp.h
+++ b/source/common/ubidiimp.h
@@ -198,8 +198,8 @@
/* in a Run, logicalStart will get this bit set if the run level is odd */
#define INDEX_ODD_BIT (1UL<<31)
-#define MAKE_INDEX_ODD_PAIR(index, level) ((index)|((int32_t)(level)<<31))
-#define ADD_ODD_BIT_FROM_LEVEL(x, level) ((x)|=((int32_t)(level)<<31))
+#define MAKE_INDEX_ODD_PAIR(index, level) ((index)|((int32_t)((level)&1)<<31))
+#define ADD_ODD_BIT_FROM_LEVEL(x, level) ((x)|=((int32_t)((level)&1)<<31))
#define REMOVE_ODD_BIT(x) ((x)&=~INDEX_ODD_BIT)
#define GET_INDEX(x) ((x)&~INDEX_ODD_BIT)